【问题标题】:Program looping two times (printing statement twice)程序循环两次(打印语句两次)
【发布时间】:2015-03-04 08:21:46
【问题描述】:

我正在尝试制作一个用户应该输入字符“a”的简单程序。它应该循环直到输入'a'。如果没有正常工作的输入,我会打印一份声明。如果输入了不正确的字母或数字,还有另一个语句,但问题是这会导致程序循环不止一次,并且会多次打印语句。任何解决此问题的帮助表示赞赏。

#include <stdio.h>

int main()
{
    char input;
    int i, len,num;
    len = 1;

    do
    {
        puts("Please enter alphabet 'a': ");
        scanf("%c", &input);
        for(i=0; i<len; i++)
        {
            if(isalpha(input)==0)
            {
                printf("Please input something.\n");
                continue;
            }
            if(input == 'A' || input == 'a')
            {
                printf("Congratulations! You successfully input letter 'a'.");
                return(0);
            }
            else
            {
                printf("That's not letter 'a'.");
            }
        }
    }
    while(1);
}

【问题讨论】:

  • for 循环的意义何在?此外,在假设变量包含有效值之前,您应该检查 scanf() 的返回值。
  • for 循环肯定会循环一次。去掉它。这是不必要的。另外,当您不输入字母时,您将有一个无限循环。并使用while(1) 而不是do...while(1);。你也忘了包括ctype.h。此外,在main 末尾使用return(0); 更好。您的代码中也有一个未使用的变量 num
  • 嗨。我尝试摆脱 for 循环并运行程序,但它仍然没有解决我遇到的问题。

标签: c while-loop


【解决方案1】:

问题是输入字符后,你按下换行符,这将被发送到输入缓冲区。现在下次调用scanf() 时,它会从缓冲区中读取'\n'scanf() 的值,从而将其存储到input。现在这可以通过@Gopi 指出的方法轻松解决,但是有更好的方法。这是代码。

#include <stdio.h>
#include<ctype.h>

int main()
{
    char input,ch;

    do
    {
        puts("Please enter alphabet 'a': ");
        scanf("%c", &input);
        while( input!='\n' && (ch=getchar())!='\n' && ch!= EOF);   // look here

            if(isalpha(input)==0)
            {
                printf("Please input something.\n");
                continue;
            }
            if(input == 'A' || input == 'a')
            {
                printf("Congratulations! You successfully input letter 'a'.");
                return(0);
            }
            else
            {
                printf("That's not letter 'a'.");
            }

    }
    while(1);
}

现在使用while((ch=getchar())!='\n' &amp;&amp; ch!= EOF); 语句,所有像'\n' 这样的字符都被刷新而不存储到input,从而解决了问题。

还要注意,这里不需要 for 循环,它对这段代码没用(除非这不是你的原始代码并且其中还有其他部分)。

【讨论】:

  • 这需要两个空白值(按两次回车)让程序输出“请输入一些东西”,但这绝对是一个更好的解决方案。谢谢。
  • @grammer ,解决了这个问题。
【解决方案2】:

在第一个输入之后的缓冲区中有一个换行符,它没有被刷新,并且在第二次迭代中被%c 拾取。

将您的 scanf() 更改为

scanf(" %c", &input);

注意%c 之前的空格,它会吞噬换行符

【讨论】:

  • 这个解决方案有效,但问题是如果用户在没有任何输入的情况下直接按回车,它不会输出“请输入一些东西”。
  • @grammer 你的代码真的搞砸了。为什么在while循环中需要for循环。所以基本上换行符不是字母,所以你什么都看不到..