You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C语言输入下溢场景下fgets读取异常的字符串反转程序问题排查

问题根因
  • 故障核心是fgets的读取逻辑和你写的清缓冲区逻辑不匹配:
    1. fgets读取输入时,如果输入内容(含末尾的回车换行符\n)总长度 ≤ MAX+1,会直接把\n也写入到word数组中,此时输入缓冲区已经没有残留数据
    2. 你当前代码无条件调用clearInputBuffer(),当输入较短时,该函数内的getchar()会阻塞等待新的输入,直到读到新的\n才会返回,这就是短输入需要按两次回车的原因
    3. 同时word数组里携带的\n会被strlen统计为有效长度,反转时会把\n也反转到字符串的靠前位置,导致输出自动换行、结果异常
  • 额外小问题:clearInputBuffer里的buff变量不需要加static修饰,static会让变量在函数调用之间保留值,反而有潜在的逻辑风险
修复方案

只需要调整fgets读取后的处理逻辑,先判断是否读到了换行符,再决定要不要清缓冲区,同时把多余的换行符替换成字符串结束符即可:

  1. 删除原来无条件调用clearInputBuffer();的那行代码
  2. 在fgets读取完成、判断退出逻辑之后,插入如下代码:
char* newline_pos = strchr(word, '\n');
if (newline_pos != NULL) {
    // 输入长度未超过MAX,换行符已经被读入数组,替换为结束符即可
    *newline_pos = '\0';
} else {
    // 输入长度超过MAX,缓冲区还有残留内容,执行清空
    clearInputBuffer();
}

修改后长短输入的逻辑都会符合预期,短输入不需要多按一次回车,反转结果也不会异常换行。

内容的提问来源于stack exchange,提问作者George Glebov

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.24 21:24:07