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

标签 c

我遇到一个问题,如果用户输入的字符数大于最大字符数,例如“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/

相关文章:

c - 我应该照顾 memcmp 中的 n 吗?

c - 我尝试打印列表时出现问题

c++ - L做什么的?

c - 仅对视频文件的部分进行 Remux 和分段,而输出没有差异

c - 多个 printf() 调用与一个长字符串的 printf() 调用?

c - 使用随机值开始循环,然后循环整个范围

python - 为什么在我使用 Cython 的情况下向 C 连续数组赋值很慢

c - 高效的数据结构和搜索算法,用于根据其加密值存储字符串

c - 简单的 UDP 服务器不能接受数据包

c - 在 Windows 上诊断 C 应用程序崩溃的工具/技术