C 正在清除stdin缓冲区?

C 正在清除stdin缓冲区?,c,C,我正在编写一些代码,并使用fgets获取用户输入。然后我在代码上写了一个循环,不断请求用户输入,直到用户退出。但是第二次它问的时候,它写了两次“请输入您的输入”,而不是一次,并且第一次没有等待我的输入。 所以,我在谷歌上搜索了一下,发现stdin缓冲区被填满了,必须清除它。 我找到了这个解决方案: void dump_line(FILE * fp) { int ch; while ((ch = fgetc(fp)) != EOF && ch != '\n') {

我正在编写一些代码,并使用fgets获取用户输入。然后我在代码上写了一个循环,不断请求用户输入,直到用户退出。但是第二次它问的时候,它写了两次“请输入您的输入”,而不是一次,并且第一次没有等待我的输入。 所以,我在谷歌上搜索了一下,发现stdin缓冲区被填满了,必须清除它。 我找到了这个解决方案:

void dump_line(FILE * fp) {
    int ch;
    while ((ch = fgetc(fp)) != EOF && ch != '\n') {
        /* null body */;
    }
}
然后从主函数调用:

dump_line(stdin);
我很难理解它。据我所知,它只是将fgetc(stdin)的值赋值为“ch”。。我简直无法理解如何将fgetc(stdin)分配给“ch”来清除缓冲区。 非常感谢你的帮助

它只是将fgetc(stdin)的值赋值给“ch”


调用
fgetc
会产生副作用,即读取字符并从该文件流中删除

fgetc()
从缓冲区获取字符。此代码从缓冲区读取字符,直到到达文件结尾或新行。

这是相同的循环,但编写方式不同,也许这可以解释:

void dump_line(FILE * fp) { /* dump a line from fp */
    int ch; /* temporary storage for character */

    while (1) {
        ch = fgetc(fp); /* read char from fp, this removes it from the stream */

        if (ch == EOF)  /* break if we reached END-OF-FILE */
            break;

        if (ch == '\n') /* break if we reached a newline, because */
            break;      /* we have succesfully read a line */
    }
}
fgetc(stdin)
分配给
ch
并不是清除缓冲区的方法。真正的调用是
fgetc(stdin)
。每次调用(以及循环的每次迭代)都会吃掉
stdin
中的一个字符

工作原理:

  • 调用
    fgetc(stdin)
    ,并将结果分配给
    ch
  • 如果
    ch
    不等于
    EOF
    '\n'
    ,请转到1

  • 当循环停止时,有两件事是正确的:要么你刚刚吃了标记当前行结束的字符(读:你现在在下一行),要么
    stdin
    为空,你将不会得到更多的输入。(后者在交互式应用程序中是不常见的,但当人们从其他地方将内容导入你的应用程序时,这种情况很常见。准备好了。)

    如果我真的需要用纯C语言输入,这里有一个旧的代码片段供用户输入:

    int get_line(char *buffer, int bsize)
    {
        int ch, len;
    
        fgets(buffer, bsize, stdin);
    
        /* remove unwanted characters from the buffer */
        buffer[strcspn(buffer, "\r\n")] = '\0';
    
        len = strlen(buffer);
    
        /* clean input buffer if needed */
        if(len == bsize - 1)
            while ((ch = getchar()) != '\n' && ch != EOF);
    
        return len;
    }
    
    它从stdin中检索
    bsize
    字母量,并将它们存储到给定的缓冲区中。stdin输入缓冲区中的剩余内容将自动清理。它还会从输入数据中删除换行符(\r和\n)


    函数返回成功读取的字符数。

    另一个清除缓冲区的示例:

    char ch[1];
    while(1){
        ch[0] = fgetc(stdin);
        if(ch[0] == '\n' || ch[0] == EOF) break;
    }
    

    这里有一个两行解决方案,我想出了,希望这有助于别人

    charch;
    而((ch=fgetc(stdin))==EOF | | ch=='\n');
    

    fgetc
    同时读取和删除STDIN缓冲区。它将继续这样做,直到到达EOF或换行符,这意味着STDIN现在是空的。

    哦,好吧,我想知道为什么教程完全忘记提到它。谢谢:数据缓冲区未满。它只包含一个您没有读过的行终止符,并且您发布的循环读取该行终止符。