【问题标题】:What's while doing here in the code?在代码中做什么?
【发布时间】:2013-09-02 12:47:40
【问题描述】:

在下面的一段代码中,while 循环在做什么(标有“循环”)?:-

int main(void)
{
    char code;

    for (;;)
    {
        printf("Enter operation code: ");
        scanf(" %c", &code);
        while (getchar() != '\n')   // loop
            ;
        switch (code)
        {
        case 'i':
            insert();
            break;
        case 's':
            search();
            break;
        case 'u':
            update();
            break;
        case 'p':
            print();
            break;
        case 'q':
            return 0;
        default:
            printf("Illegal code\n");
        }
        printf("\n");
    }
}

声明:代码不完整,只是代码的一部分,无法编译。

【问题讨论】:

标签: c loops


【解决方案1】:

getchar() 在这里用来吃掉用户输入的额外字符和换行符\n
假设用户输入操作码为

isupq\n // '\n' is for "Enter" button

那么,scanf() 将只读取字符 i,其余五个字符将被语句消耗

while (getchar() != '\n')   
        ;  

因此,对于下一次迭代,scanf() 将等待用户输入一个字符,而不是从输入缓冲区中读取它。

【讨论】:

  • 那为什么编译器在这里跳过对 scanf() 函数的调用?这段代码有什么问题?解决办法是什么?见这里:ideone.com/txlQm8
  • @PravasiMeet;在函数getdata 中,在第二次迭代中fgets 正在读取'\n' 留下的scanf。放置一个getchar(); 语句来吃掉那个换行符。ideone.com/Dap2Bj
【解决方案2】:
while (getchar() != '\n')   // loop
;

是来清理缓冲区的。

这个同时解决的问题是scanf(" %c", &code); 只从输入缓冲区中抓取一个字符。这很好,只是输入缓冲区中仍然有一个换行符,这是在您输入后点击“输入”导致的。输入缓冲区需要缓冲区清除。这就是while循环的作用

这是c的常见问题

【讨论】:

  • 这是未定义的行为。
【解决方案3】:

这里应用程序等待用户按下回车键。

【讨论】:

    【解决方案4】:

    由于给定代码中的for 循环是无限循环,因此while 循环正在检查输入字符是否为\n。如果输入的字符是\n,它就会移向开关盒。一般来说,它正在等待按下返回键以确认您的输入。

    【讨论】:

      【解决方案5】:

      如果您使用 fgetc 函数,您不必担心并检查无限循环中的回车键。即使您输入多个字符,也只会输入第一个字符

      int main(void)
      {
      char code;
      
      for (;;)
      {
          printf("Enter operation code: ");
          code = fgetc(stdin);
      
          switch (code)
          {
          case 'i':
              insert();
              break;
          case 's':
              search();
              break;
          case 'u':
              update();
              break;
          case 'p':
              print();
              break;
          case 'q':
              return 0;
          default:
              printf("Illegal code\n");
          }
          printf("\n");
      }
      }
      

      【讨论】:

        【解决方案6】:

        scanf() 通常不是扫描char 变量的好方法,因为您在输入字符后按的 Enter 仍保留在输入缓冲区中。下次调用 scanf("%c", &input) 时,缓冲区中已经存在的这个 Enter 会被读取并分配给输入,从而跳过用户的下一个输入。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2010-12-30
          • 2016-05-31
          • 2014-02-28
          • 1970-01-01
          • 2013-08-22
          • 2010-10-03
          • 2018-11-01
          • 1970-01-01
          相关资源
          最近更新 更多