C语言缓冲区指针打印函数问题求助:循环打印指定长度内容
C语言作业问题排查与修正
问题背景
作业要求实现可循环调用的printLine函数:从char缓冲区的指定指针位置打印指定长度内容,遇到换行符时返回false终止循环。函数签名要求:
bool printLine(char *cbuffer, char *ptr, int bufferFillLength)
注:原签名中cbuffer应为指针类型,你写的char cbuffer是错误的。
代码中的关键错误
- 函数签名错误:
cbuffer是缓冲区起始指针,需定义为char *cbuffer而非char cbuffer,否则无法正确访问缓冲区。 - 未初始化指针:
char *bufferprinttext未分配内存或指向有效空间,直接调用strncpy会触发内存访问违规。 - 指针误用为数组下标:
&cbuffer[ptr]中ptr是char*类型,强制转为整数作为下标会导致地址计算完全错误,直接用ptr作为起始地址即可。 - 缺少字符串终止符:
strncpy不会自动添加'\0',printf("%s")会读取到内存中随机数据,引发未定义行为。 - 数组赋值错误:
main中cbuffer = "..."是非法操作,数组不能直接用赋值语句赋值字符串,需用strcpy完成。 - 起始位置逻辑错误:
bufferCounter初始为0,第一次循环后变为1,直接从printLength*1位置开始打印,跳过了前25个字符,导致起始位置错误。 - 换行符判断不可靠:依赖未正确终止的
bufferprinttext的strlen结果,会导致下标越界或错误判断。
修正后的代码
#include <stdio.h> #include <stdlib.h> #include <string.h> #include <stdbool.h> #define BUFFER_SIZE 300 bool printLine(char *cbuffer, char *ptr, int printLength) { // 计算当前指针相对于缓冲区的偏移,避免超出缓冲区范围 int offset = ptr - cbuffer; if (offset >= BUFFER_SIZE) { return false; } bool foundNewline = false; int printCount = 0; // 逐字符打印,直到达到指定长度、遇到换行符或缓冲区结束 while (printCount < printLength && offset + printCount < BUFFER_SIZE) { char c = ptr[printCount]; putchar(c); if (c == '\n') { foundNewline = true; printCount++; // 打印换行符本身 break; } printCount++; } // 如果遇到换行符,返回false终止循环;否则返回true继续 return !foundNewline; } int main(int argc, char *argv[]) { char cbuffer[BUFFER_SIZE]; int printLength = 25; bool continuePrint = true; char *currentPtr = cbuffer; // 使用strcpy给数组赋值字符串 strcpy(cbuffer, "Fusce dignissim facilisis ligula consectetur hendrerit.\nVestibulum porttitor aliquam luctus. Nam pharetra lorem vel ornare condimentum. Praesent et nunc at libero vulputate convallis. Cras egestas nunc vitae eros vehicula hendrerit. Pellentesque in est et sapien dignissim molestie."); while (continuePrint) { continuePrint = printLine(cbuffer, currentPtr, printLength); // 更新指针到下一段起始位置 currentPtr += printLength; // 防止指针超出缓冲区边界 if (currentPtr - cbuffer >= BUFFER_SIZE) { break; } } return 0; }
修正说明
- 修正函数签名,将
cbuffer改为指针类型。 - 移除未初始化的临时指针,直接逐字符打印,避免字符串终止符问题。
- 正确使用
currentPtr跟踪当前打印起始位置,避免下标计算错误。 - 用
strcpy完成数组字符串赋值。 - 增加缓冲区边界检查,防止越界访问。
- 逐字符判断换行符,确保遇到换行符后立即终止打印并返回
false。
内容的提问来源于stack exchange,提问作者user3741611
相关产品推荐
相关产品推荐

