读取用户命令继续不起作用

时间:2013-01-17 11:12:45

标签: c do-while getchar

我正在为计费系统编写程序。我在我的程序中使用do-while循环。并且程序根据用户输入执行。如果用户想继续执行,程序将继续。但我在执行方面遇到了问题。我在简单的do-while循环中尝试我的逻辑。同样的问题也出现在简单的do-while循环中。

Problem is: If the input is yes, the program does not get the further input from user.

这个简单的do-while循环是:

#include <stdio.h>

main()
{
    int c;
    char ch;
    do
    {
            printf("enter the no less then 4:");
            scanf("%d",&c); 
        switch(c)
        {
            case 1:
                printf("In 1\n");
                break;
            case 2:
                printf("In 2\n");
                break;
            case 3:
                printf("In 3\n");
                break;
        }
        printf("do u want to continue?:");
        ch=getchar();
    }while(ch=='y');
}

如果我放while(ch != 'n')而不是while(ch=='y')该程序正常运行。我无法理解这背后的问题。请帮我纠正这个问题。并解释这个问题。谢谢你提前。

4 个答案:

答案 0 :(得分:2)

首次运行,打印3,用户输入“y”并按回车

getchar()读取'y'和程序循环

第二次,getchar()从上一次按键

中读取换行符

换行符不是'y'所以程序不循环

答案 1 :(得分:1)

几个问题:

  1. getchar返回一个int而不是char,因此ch必须是int,就像c一样。
  2. scanf需要一个指向%d的指针,因此它应该是scanf("%d", &c);
  3. while应该测试EOF,如while ((ch = getchar()) != EOF)
  4. 请注意,输入将包含您应该处理的换行符(例如,忽略)。
  5. 这应该非常强大:

    #include <stdio.h>
    
    int main(void)
    {
      int c, ch;
    
      for (;;) {
        printf ("Enter a number (1, 2 or 3):");
        fflush (stdout);
        if (scanf ("%d", &c) == 1) {
          switch (c) {
          case 1:
            printf ("In 1\n");
            break;
          case 2:
            printf ("In 2\n");
            break;
          case 3:
            printf ("In 3\n");
            break;
          }
          printf ("Do you want to continue? [y/n]:");
          fflush (stdout);
          while ((ch = getchar ())) {
            if (ch == 'y')
              break;
            else if (ch == 'n' || ch == EOF)
              return 0;
          }
        } else {
          printf ("That was not a number. Exiting.\n");
          return 0;
        }
      }
    }
    

答案 2 :(得分:0)

虽然(ch =='y')或者while()中的任何字符,它会按照你的编码发送到案例3 ......你是按,它会被发送到案例3,否则它将无法工作

答案 3 :(得分:0)

请使用getchar

,而不是使用fgets阅读答案

正如其他人所解释的那样,第二个getchar来电会为您提供换行符,该换行符是在第一个y之后输入的。 使用fgets,您将获得用户输入的所有内容。然后你可以检查它是y(只检查第一个字符,或使用strcmp)。