C语言输入下溢场景下fgets读取异常的字符串反转程序问题排查
问题根因
- 故障核心是
fgets的读取逻辑和你写的清缓冲区逻辑不匹配:fgets读取输入时,如果输入内容(含末尾的回车换行符\n)总长度 ≤MAX+1,会直接把\n也写入到word数组中,此时输入缓冲区已经没有残留数据- 你当前代码无条件调用
clearInputBuffer(),当输入较短时,该函数内的getchar()会阻塞等待新的输入,直到读到新的\n才会返回,这就是短输入需要按两次回车的原因 - 同时
word数组里携带的\n会被strlen统计为有效长度,反转时会把\n也反转到字符串的靠前位置,导致输出自动换行、结果异常
- 额外小问题:
clearInputBuffer里的buff变量不需要加static修饰,static会让变量在函数调用之间保留值,反而有潜在的逻辑风险
修复方案
只需要调整fgets读取后的处理逻辑,先判断是否读到了换行符,再决定要不要清缓冲区,同时把多余的换行符替换成字符串结束符即可:
- 删除原来无条件调用
clearInputBuffer();的那行代码 - 在
fgets读取完成、判断退出逻辑之后,插入如下代码:
char* newline_pos = strchr(word, '\n'); if (newline_pos != NULL) { // 输入长度未超过MAX,换行符已经被读入数组,替换为结束符即可 *newline_pos = '\0'; } else { // 输入长度超过MAX,缓冲区还有残留内容,执行清空 clearInputBuffer(); }
修改后长短输入的逻辑都会符合预期,短输入不需要多按一次回车,反转结果也不会异常换行。
内容的提问来源于stack exchange,提问作者George Glebov
相关产品推荐
相关产品推荐

