switch语句创建无限循环

时间:2014-09-16 01:17:54

标签: c loops switch-statement scanf

我正在编写一段代码,在我的代码的一部分中,我使用的是C语言的switch语句。如果我按n它正确退出如果我按y它将无限循环默认语句直到我按下控制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;
}

1 个答案:

答案 0 :(得分:1)

按Enter键时,换行符\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或负数,则发生另一个问题。