如何限制fgets仅接受指定长度输入并处理超长输入?
问题分析与修复方案
原代码存在两个核心问题:
fflush(stdin)是未定义行为:C标准仅规定fflush对输出流有效,用它清空输入缓冲区在不同编译器下行为不一致,无法可靠清除剩余输入。- 超长输入的判断逻辑错误:当输入超过9个字符时,
fgets会读取前9个字符(缓冲区大小为10,最后一位留给终止符\0),此时strlen(buffer)等于9,不会触发>9的判断,剩余字符会留在输入缓冲区,导致下一次fgets继续读取,出现拆分输出的情况。
修复后的代码
#include <stdio.h> #include <string.h> int main() { char buffer[10]; while (1) { if (fgets(buffer, 10, stdin) == NULL) { // 处理EOF或读取错误 break; } // 检查输入是否超长:buffer中没有换行符,说明输入超过了缓冲区可容纳的字符数 if (!strchr(buffer, '\n')) { printf("invalid\n"); // 清空输入缓冲区:读取所有剩余字符直到换行或EOF int c; while ((c = getchar()) != '\n' && c != EOF); continue; } // 移除换行符 buffer[strcspn(buffer, "\n")] = '\0'; // 处理有效输入 printf("Input: %s\n", buffer); } return 0; }
关键修改说明
- 替换
fflush(stdin):用getchar()循环读取剩余字符,直到遇到换行符或EOF,这是标准C中可靠清空输入缓冲区的方法。 - 修正超长输入判断:通过
strchr(buffer, '\n')检查输入是否包含换行符。如果fgets读取的内容里没有换行符,说明输入的字符数超过了缓冲区可容纳的上限(9个可见字符+1个终止符),判定为超长输入。 - 调整循环逻辑:确保每次输入处理完成后,要么处理有效输入,要么清空缓冲区后重新等待输入,避免剩余字符干扰下一次读取。
内容的提问来源于stack exchange,提问作者HyperCoderSuperion
相关产品推荐
相关产品推荐

