【问题标题】:How to prevent fgets running multiple times when overflowing a buffer?溢出缓冲区时如何防止fgets多次运行?
【发布时间】:2019-03-21 14:17:22
【问题描述】:

我有一个问题,如果用户输入的输入大于最大字符数,例如“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) 不是刷新标准输入的正确方法。

【问题讨论】:

标签: c


【解决方案1】:

没有什么是自动的。检查输入是否以换行符结尾。如果没有,请在循环中调用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';)
            ;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-23
    • 1970-01-01
    • 2011-02-17
    • 2021-10-12
    • 1970-01-01
    相关资源
    最近更新 更多