我遇到一个问题,如果用户输入的字符数大于最大字符数,例如“abcdefg”(当最大值为 5 时),循环内的 fgets()
会运行两次它不是打印“abcd”,而是打印出“abcd”,然后打印“efg”。
我认为这是因为 fgets()
最多只能处理 4 个字符和一个空终止符,但标准输入缓冲区中仍然存在“efg”。
我想知道是否有一种方法可以只获取“abcd”并丢弃超过分配缓冲区最大大小的任何剩余输入的其余部分。
#define INPUT_MAX 5
int main(int argc, char* argv[]){
char input[INPUT_MAX];
while(1){
printf("prompt> ");
fgets(input, INPUT_MAX, stdin);
printf("\n%s\n", input);
}
}
运行示例:
prompt> abcdefg <-- I press enter once here for /n
abcd
prompt>
efg
prompt> . <-- I end up here after enter command
我发现 fflush(stdin)
不是刷新 stdin 的正确方法。
最佳答案
没有什么是自动的。检查输入是否以换行符结尾。如果没有,请循环调用 getchar()
直到获得换行符或 EOF。
while(1){
printf("prompt> ");
if (fgets(input, INPUT_MAX, stdin) == NULL) {
break;
}
printf("\n%s\n", input);
if (input[strlen(input)-1] != '\n') {
for (int c; (c = getchar()) != EOF && c != '\n';)
;
}
关于c - 如何防止 fget 在缓冲区溢出时多次运行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55282505/