在c中使用do while循环从用户那里获取输入

时间:2014-10-03 07:48:52

标签: c algorithm

我正在创建一个用于生成下一个素数的程序,我需要对其进行用户输入。我正在使用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

3 个答案:

答案 0 :(得分:1)

stdin将包含y\n(y后跟回车符)。由于您的代码将Nn以外的任何字符视为是,因此如果输入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);

使用前导空格忽略输入缓冲区中的最后一个字符。