我有一个问题,如果用户输入的字符数大于最大字符数(例如“ abcdefg”),而最大值为5,则循环中的fgets()
将运行两次,而不是“ abcd” ”,它先打印出“ abcd”,然后打印“ efg”。
我认为这是因为fgets()
仅处理最多4个字符和一个空终止符,但stdin缓冲区中仍然存在“ 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);
}
}
示例RUN:
prompt> abcdefg <-- I press enter once here for /n
abcd
prompt>
efg
prompt> . <-- I end up here after enter command
我发现fflush(stdin)
不是刷新标准输入的正确方法。
答案 0 :(得分:3)
没有自动的。检查输入是否以换行符结尾。如果不是,请循环调用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';)
;
}