【问题标题】:switch statement creating infinite loopswitch 语句创建无限循环
【发布时间】:2025-11-23 20:25:01
【问题描述】:

我正在编写一段代码,在我的代码的一部分中,我使用了 C 语言的 switch 语句。如果我按 n,它会正确退出,如果我按 y,它将无限循环默认语句,直到我按 control c。我在这里做错了什么。一直在更改 while 语句,但找不到正确的。

int main()
{
    char ans;
    printf("DO you want to continue?");
    scanf("%c", &ans);
    do
    {
      switch(ans)
      {
            case 'y':
                some stuff...
                   printf("DO you want to continue?");
                   scanf("%c", &ans);
                   break;
            case'n':
                  printf("BYE");
                  break;
            default:
                 printf("error, you must enter y or n");
                 continue;
       }
   }
   while (ans!='n');
   return 0;
}

【问题讨论】:

  • 在我看来像 C ...
  • 如果他/她没有输入“y”或“n”并且您打印错误消息,您不想让用户再次尝试输入字符吗?跨度>

标签: c loops switch-statement scanf


【解决方案1】:

当您按下回车键时,换行符\n 被添加到输入流中。您的代码没有预料到这一点,因为 switch(ans) 仅处理 yn 或“其他所有内容”(包括换行符)。

要解决此问题,请允许 scanf 通过将格式字符串更改为 " %c" 来忽略任何前面的空格,例如

scanf(" %c", &ans);
//     ^ space character inserted here

我认为将scanf 调用移到循环内部会更有意义,如下所示:

int main()
{
    char ans;

    do
    {
        printf("DO you want to continue?");
        if (scanf(" %c", &ans) != 1)
            break;

        switch(ans)
        {
            case 'y':
                //  some stuff...
                break;
            case 'n':
                printf("BYE");
                break;
            default:
                printf("error, you must enter y or n");
                continue;
        }
    }
    while (ans!='n');
}

不要忘记始终检查scanf() 的结果。它将返回成功扫描的项目数(在您的情况下,您希望它返回 1)。如果返回 0 或负数,则说明发生了另一个问题。

【讨论】:

  • 我在查看这篇文章时才发现这一点!哈哈谢谢你。