我希望此节目能够显示以下内容。
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;
}
答案 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();
它会起作用。