如何防止缓冲区溢出时多次运行?

  • 本文关键字:运行 何防止 缓冲区 溢出 c
  • 更新时间 :
  • 英文 :


我有一个问题,如果用户输入的输入大于最大字符数,例如"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%sn", input);
}
}

示例运行:

prompt> abcdefg   <-- I press enter once here for /n
abcd
prompt> 
efg
prompt> .         <-- I end up here after enter command

我发现fflush(stdin)不是刷新标准的正确方法。

没有什么是自动的。检查输入是否以换行符结尾。如果没有,请在循环中调用getchar(),直到获得换行符或 EOF。

while(1){
printf("prompt> ");
if (fgets(input, INPUT_MAX, stdin) == NULL) {
break;
}
printf("n%sn", input);
if (input[strlen(input)-1] != 'n') {
for (int c; (c = getchar()) != EOF && c != 'n';)
;
}

相关内容

最新更新