繁体   English   中英

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

[英]How to prevent fgets running multiple times when overflowing a buffer?

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

示例运行:

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%s\n", input);
    if (input[strlen(input)-1] != '\n') {
        for (int c; (c = getchar()) != EOF && c != '\n';)
            ;
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM