【问题标题】:Taking input from user using do while loop in c在c中使用do while循环从用户那里获取输入
【发布时间】:2014-10-03 07:48:52
【问题描述】:

我正在创建一个用于生成下一个素数的程序,我需要接受用户输入。我正在使用 do-while 循环,但它不会停止第二次输入。请指导我哪里做错了。谢谢! 这是我的代码 sn-p

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

【问题讨论】:

  • 尝试" %c"作为您的格式字符串。请参阅this question 的第二个答案。这有很多重复;那是我遇到的第一个。

标签: c algorithm


【解决方案1】:

标准输入将包含y\n(y 后跟回车)。由于您的代码将除 Nn 之外的任何字符视为是,因此如果您输入 y 后跟回车,它会计算 2 个新素数。

要在读取单个字符时跳过空格,请在扫描码前加一个空格:

scanf(" %c",&input);

【讨论】:

    【解决方案2】:

    scanf 中的%c 之前添加一个空格将解决问题。

    这样做是因为scanf 在输入第一个字符并将其留在stdin 中后不会消耗\n 字符。由于Enter 键(\n)也是一个字符,因此它会被消耗在下一次scanf 调用之前,您的循环将再次执行。%c 之前的空格将丢弃所有空格,如空格。

    解决此问题的另一种方法是在scanf 之后添加getchar(); 以吃掉\n,但我更喜欢第一个。

    【讨论】:

    • 我也更喜欢第一个,因为如果用户一次输入多个字符,它的行为会更加一致。
    【解决方案3】:

    这里有答案:Reading a single character in C

    当您按“Y”时,您按 Enter,它位于输入缓冲区中,并在循环的下一次迭代中被读取。

    你需要使用:

    scanf(" %c",&input);
    

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

    【讨论】:

    • 谢谢..这真的很有帮助。
    猜你喜欢
    • 2017-08-29
    • 2015-10-02
    • 2021-03-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-03
    相关资源
    最近更新 更多