如何解决-使用getchar()和do-while意外输出

时间:2019-03-27 09:33:52

标签: c if-statement do-while logical-operators getchar

我正在尝试编写一个简单的代码,该代码将从输入中读取一个字符并执行“正确”或“错误输入”,然后再次运行该代码,直到输入正确的输入为止。首先,它不适用于大写X。我要解决的另一个问题是,在输入错误之后,我必须按Enter键才能获得“ Enter x”消息,而不是在输入错误消息后立即进入。预先感谢。我是初学者。

#include <stdio.h>
int main()
{
         do
         {
            printf("Enter x\n");
            if (getchar()=='x'|| getchar()=='X')
            {
            printf("Entered char is X\n");
            return 0;
            }
            else
            {
            printf("Input incorrect! Please try again!!!\n");
            }
         }
         while (getchar()!='x' || getchar()!='X');
     return 0;
 }

3 个答案:

答案 0 :(得分:0)

您需要将输入存储在变量中,否则对于每个getchar调用,您都会连续多次要求输入。

由于古怪的历史原因,getchar实际上会返回int,因为可以从中返回的值EOFint。因此变量必须为int

最后,每次用户按下Enter键时,在输入流中都会附加一个不可见的换行符\n。这个字符对您没有好处,因此您应该多读一些字符。

#include <stdio.h>

int main (void)
{
  int input;

  do
  {
    printf("Enter x\n");
    input = getchar();
    getchar(); // extra getchar to chew up line feed from stdin

    if (input=='x'|| input=='X')
    {
      printf("Entered char is X\n");
    }
    else
    {
      printf("Input incorrect! Please try again!!!\n");
    }
  } while (input!='x' && input!='X'); 

  return 0;
}

请注意,input=='x'|| input=='X'的反义词是input!='x' && input!='X'(De Morgan的定律)。 “如果输入不是'x'并且输入不是'X',则循环”。

答案 1 :(得分:-1)

当您按下ENTER键时,换行符\n将放置在输入缓冲区中。您需要使用该换行符才能读取下一个字符。
另外,您正在阅读两次,在这种情况下这是不必要的。所以你的代码应该是这样的

#include <stdio.h>
int main()
{
         char inp;
         do
         {
            printf("Enter x\n");
            inp = getchar();
            getchar(); // reading the newline character '\n'
            if (inp == 'x'|| inp =='X')
            {
               printf("Entered char is X\n");
               return 0;
            }
            else
            {
               printf("Input incorrect! Please try again!!!\n");
            }
         }
         while (inp !='x' || inp !='X');
     return 0;
 }
  

p.s不需要在while循环中放入条件检查,因为您要返回if条件。 while(true)可以正常工作。感谢@bruno指出这一点。

答案 2 :(得分:-2)

在您的代码中:

if (getchar()=='x'|| getchar()=='X')

getchar()被调用两次。

相反,您应该这样写:

char c = getchar();
if (c=='x'|| c=='X')

对于第二部分,如果您的目标是在新行上打印消息,则只需将printf更改为:

printf("\nInput incorrect! Please try again!!!\n");