C语言实现输入字符串折行功能遇阻,求故障排查帮助
问题分析与修复方案
你的代码存在多处语法与逻辑错误,导致无法正常运行,逐个问题说明并修复如下:
1. 全局变量声明错误
extern int fnlstr_pos = 0; 用法违规:extern仅用于声明外部已定义的变量,不能同时初始化。直接改为全局变量定义即可:
int fnlstr_pos = 0;
2. 运算符优先级陷阱
while(c=getchar() != EOF) 中,!=优先级高于=,实际执行逻辑是c = (getchar() != EOF),导致c只会被赋值为0或1,而非输入的字符。修正为:
while((c=getchar()) != EOF)
3. 函数声明缺失
C语言要求函数在调用前必须声明或定义。需在main函数前添加to_printandi的函数声明,或者将函数定义移至main之前。
4. 数组越界与逻辑顺序错误
当pos + 1 >= MAXCOL时,你已将字符存入line[pos],但后续的++pos会让pos超出line数组的下标范围(line长度为MAXCOL,合法下标为0~MAXCOL-1)。需调整逻辑顺序,先判断是否需要折行,再处理字符存储与指针移动。
5. 换行符处理逻辑错误
to_printandi函数中,复制完字符后final_string[fnlstr_pos]是未赋值的内存位置,判断该位置是否为换行符完全错误。此外,当输入本身包含换行符时无需额外添加,否则会出现重复换行;仅在主动折行时需要添加换行符。
6. 未处理EOF前的剩余字符
当输入结束(遇到EOF)时,如果pos > 0,说明line数组中还有未处理的字符,需调用to_printandi完成收尾。
7. 字符串未添加终止符
C语言字符串必须以'\0'结尾,否则printf("%s")会输出乱码,需在处理完所有字符后为final_string添加终止符。
修正后的完整代码
#include <stdio.h> #define MAXCOL 10 #define FINAL_LENGTH 300 char line[MAXCOL]; char final_string[FINAL_LENGTH]; int fnlstr_pos = 0; // 函数声明:add_newline标记是否需要手动添加换行 void to_printandi(int pos, int add_newline); int main() { int pos = 0; int c; while((c = getchar()) != EOF) { // 先判断是否需要折行或处理换行 if (pos >= MAXCOL - 1 || c == '\n') { line[pos] = c; // 输入是换行则无需额外加换行,主动折行则需要 to_printandi(pos, c != '\n'); pos = 0; } else { line[pos] = c; pos++; } } // 处理EOF前未完成的剩余字符 if (pos > 0) { to_printandi(pos - 1, 1); } // 添加字符串终止符,避免越界 if (fnlstr_pos < FINAL_LENGTH - 1) { final_string[fnlstr_pos] = '\0'; } else { final_string[FINAL_LENGTH - 1] = '\0'; } printf("%s", final_string); return 0; } void to_printandi(int pos, int add_newline) { int i; for(i = 0; i <= pos; ++i){ // 检查是否超出final_string容量,避免越界 if (fnlstr_pos >= FINAL_LENGTH - 1) { break; } final_string[fnlstr_pos] = line[i]; fnlstr_pos++; } // 需要添加换行且还有剩余空间时执行 if (add_newline && fnlstr_pos < FINAL_LENGTH - 1) { final_string[fnlstr_pos] = '\n'; fnlstr_pos++; } }
内容的提问来源于stack exchange,提问作者Me- La Ría
相关产品推荐
相关产品推荐

