3

这是有问题的 while 循环和开关(track1 定义了一个更大的循环,此处未显示):

while (track6 ==1)
    {
    printf ("would you like to play again? Y or N?\n");
    scanf ("%c", &response);

        switch (response)
            {
            case 'Y' : track6 = 2; 
                break;
            case 'N' : printf ("thanks for playing!\n");
                            track6 = 2, track1 = 2;
                break;
                    default : printf ("response is case-sensitive and must be either Y or N. your response is invalid. please reenter.\n");
            }
    }

我收到的输出是:

would you like to play again? Y or N?

response is case-sensitive and must be either Y or N. your response is invalid. please  reenter.

would you like to play again? Y or N?

(提示输入,然后正确执行)

似乎它正在执行第一个 printf,跳过 scanf,执行默认值,回到循环顶部并从那里正常运行。知道为什么吗?这只是我的第三周编程,因此外行的术语受到赞赏。

4

4 回答 4

2

我认为它的问题在于它scanf首先读取输入 - 尝试getchar()或添加一个空格字符scanf" %c"

scanf (" %c", &response);  
于 2013-10-05T08:43:31.670 回答
1

似乎它正在执行 first printf,跳过scanf,执行默认值,回到循环顶部并从那里正常运行。知道为什么吗?

不。似乎它正在执行第一条printf语句,读取\n前一个留下的换行符()字符scanf,回到循环的顶部并从那里正常运行。吃掉这个换行符的一种可能的解决方案是改变

scanf ("%c", &response);

scanf (" %c", &response);  
        ^
        |
   add a space here to eat up '\n'  

但是,当且仅当来自用户的输入是Yor时,这才有效N。如果用户输入YESNO,超过一个字符(不包括\n),那么您的程序应该必须吃掉所有这些额外的字符才能正确运行程序。为此,在scanfin之后使用一个循环while

 printf ("would you like to play again? Y or N?\n");
 scanf ("%c", &response);
 while ((response = getchar()) != '\n' && response != EOF) 
     ;
于 2013-10-05T08:43:17.370 回答
1

scanf ("%c", &response);您需要从上一个跳过尾随换行符scanf

所以使用:

int ch;
while ((ch = getchar()) != '\n' && ch != EOF); //eats '\n' 

scanf

于 2013-10-05T08:44:56.237 回答
0

在使用 scanf 输入字符之前,您需要刷新输入缓冲区。只需使用 getchar()。它会吃掉缓冲区中存在的 '\n' 字符。

于 2013-10-05T09:49:21.300 回答