我想知道为什么它不起作用

时间:2017-03-03 11:10:38

标签: c

我希望此节目能够显示以下内容。

Data input (Ctrl+Z to exit) : a
Data input (Ctrl+Z to exit) : b
Data input (Ctrl+Z to exit) : ^Z
sum : 2

但是当我执行此代码时,Data input (Ctrl+Z to exit) :会打印几次。

例如,当我输入' A'当然' A输入' 2个字符,然后2次"数据输入(Ctrl + Z退出):"打印。

int main(void) 
{
    int cnt = 0;
    char input;

    while (1) {
        fputs("Data input (Ctrl+Z to exit) : ", stdout);
        input = getchar();

        if (input == EOF)
            break;

        fflush(stdin);
        cnt++;
    }
    printf("sum : %d", cnt);
    return 0;
}

2 个答案:

答案 0 :(得分:0)

getchar()从标准输入中读取一个字符,但您在stdin中有多个字符(您输入的字符加上输入密钥的\n),所以当它转到循环的第二次迭代它从\n读取剩余的stdin

解决方案:代替fflush(stdin)使用fpurge(stdin)清除所有缓冲数据。

编辑:您的系统可能会运气fpurge,但它是非标准的BSD功能。在基于libc的系统(Linux,例如)上,有__fpurge(参见https://www.gnu.org/software/libc/manual/html_node/Flushing-Buffers.html

答案 1 :(得分:0)

安全地读取一个char的一种简单方法是使用此函数,

char readChar()
{
    char c;
    scanf(" %c" , &c);
    return c;
}

所以在你的代码中你可以使用

input = readChar();

它会起作用。