#include <stdio.h>
void main()
{
char ans='n';
do
{
printf("\n Enter yes or no:");
scanf("%c",ans);
printf("\n entered %c",ans);
}while(ans == 'y');
}
当循环被驱逐并且scanf正在工作并且解释我的答案(比如说我的答案是y)时,它会第二次来,但不会进行扫描并退出。我可以知道这个的原因吗?为什么会发生这种情况以及处理无限循环的正确方法是什么。
答案 0 :(得分:3)
首先,你在scanf中错过了&
:
scanf("%c", &ans);
^
其次,您没有处理换行符,%c
格式说明符不会忽略空格。所以你读了一个字符,按回车键,然后scanf
立即满足下一个\n
。要忽略scanf
中的空格,请尝试:
scanf(" %c", &ans);
^
答案 1 :(得分:1)
您不仅错过了其他答案中指出的&address-of
运算符,而且还错过了返回值检查。考虑用户是在Windows中按CTRL + Z,还是在Linux中按CTRL + d来关闭stdin。您的循环将无限运行并冻结您的应用程序;)
if (scanf("%c", &ans) != 1) {
break;
}
或者,我建议使用getchar
,因为它更清晰:
int main(void) { /* NOTE: There is no "void main()" entrance point in C. main should always return 'int'. */
int c;
do {
c = getchar();
} while (c == 'y');
return 0;
}
答案 2 :(得分:-1)
使用 fflush(stdin)刷新这些返回Feed。
但是当您输入单个字符时,为什么不使用 getchar()?
编辑: 正如cnicutar在这里正确指出的那样,fflush(stdin)具有未定义的行为。似乎没有任何内置函数来处理它,因此必须在代码本身中处理。
一个例子可能是:
int ch;
while ((ch = getchar()) != '\n' && ch != EOF);
感谢您指出那里!