为什么用getchar()获取输入属于无限循环?

时间:2015-11-29 08:40:20

标签: c do-while getchar

代码:

#include <stdio.h>

int main()
{
    char ch;
    do
    {
        printf("Enter first letter?  ");
        ch=getchar();
        //scanf("%c", &ch);
    }
    while(ch!='A' || ch!='S' || ch!='M' || ch!='D');
    printf("\n terminate here");

    return 0;
}

输出:

Runtime error   time: 0 memory: 2160 signal:25
Enter first letter?  Enter first letter?  Enter first letter?  Enter     first letter?  Enter first letter?  Enter first letter?  Enter first letter?  Enter first letter?  Enter first letter?  Enter first letter?  Enter first letter?  Enter first letter?  Enter first letter?  Enter first letter?  Enter first letter?  Enter first letter?  Enter first letter?  Enter first letter?  Enter first letter? 

我尝试了所有可行的方法,但没有运气。 scanf()也无效。代码有什么问题?

3 个答案:

答案 0 :(得分:1)

循环条件在逻辑上始终为真。您只接受一个字符,但条件为真,而输入的字符不同于以下任何一个字符:&#39; A&#39;,&#39; S&#39;,&#39; M&#39;, &#39; d&#39 ;.你需要纠正这个:

{{1}}

答案 1 :(得分:1)

假设您输入A作为输入,则第一个条件不满足,但满足其他条件。 SMO也是如此。

在我看来,当你得到上述四个字母之一时,你正试图阻止你的while循环。它可以通过ch!='A' && ch!='S' &&ch!='M' && ch!='D'!(ch!='A' || ch!='S' ||ch!='M' ||ch!='D')等各种方式完成。

我在代码中使用了第二个代码,因为它只需要对代码进行少量更改。

#include <stdio.h>

int main()
{
    char ch;
    do
    {
        printf("Enter first letter?  ");
        ch=getchar();
        getchar(); // extra getchar
//scanf("%c", &ch);
    }
    while(!(ch!='A' || ch!='S' ||ch!='M' ||ch!='D'));
    printf("\n terminate here");

    return 0;
}

N.B。

你必须额外getchar(),因为在输入一封你输入按钮的信后。第二个getchar()用于获取此新行(\n)并忽略。如果您在变量中分配第二个getchar()的输入并打印ASCII字符,您将找到相同的\n值。

答案 2 :(得分:1)

  1. do-while陈述永远是真的。
  2. 所以它进入无限循环
  3. 如果ch != 'A'为假,并且条件为真,如果ch!='A'为真,则循环为真,无论是真实的。

    解决方案:使用和逻辑,而不是||使用&&