我正在创建一个用于生成下一个素数的程序,我需要对其进行用户输入。我正在使用do-while循环,但它不会停止第二次接受输入。请指导我做错的地方。谢谢! 这是我的代码段
int
main()
{
int val=1;
char input;
do
{
val=nextprime(val);
printf("\n%d\t",val);
printf("Next Prime number? Y or N ");
scanf("%c",&input);
}
while(input != 'N' && input != 'n');
return 0;
}
我得到的输出是:
2 Next Prime number? Y or N y
3 Next Prime number? Y or N
5 Next Prime number? Y or N y
7 Next Prime number? Y or N
11 Next Prime number? Y or N y
13 Next Prime number? Y or N
17 Next Prime number? Y or N y
19 Next Prime number? Y or N
23 Next Prime number? Y or N y
29 Next Prime number? Y or N
31 Next Prime number? Y or N n
答案 0 :(得分:1)
stdin将包含y\n
(y后跟回车符)。由于您的代码将N
或n
以外的任何字符视为是,因此如果输入y后跟回车符,则会计算2个新素数。
要在读取单个字符时跳过空格,请在扫描代码前添加一个空格:
scanf(" %c",&input);
答案 1 :(得分:1)
在%c
中的scanf
之前添加空格将解决问题。
这样做是因为scanf
在您输入第一个字符后不会使用\n
字符并将其保留在stdin
中。作为Enter键(\n
)也是一个字符,它被下一个scanf
调用所消耗,因此,你的循环再次被执行。%c
之前的空格将丢弃所有空格,如空格。
另一种克服此问题的方法是在getchar();
之后添加scanf
以消耗\n
,但我更喜欢第一个。{/ p>
答案 2 :(得分:0)
你有答案:Reading a single character in C
当你按下' Y'按Enter键,它位于输入缓冲区中,并在循环的下一次迭代中读取。
您需要使用:
scanf(" %c",&input);
使用前导空格忽略输入缓冲区中的最后一个字符。