-4
#include <stdio.h>


int main()
{
    int x, y, i, temp, sum;
    char j = 'y';
    do
    {
        ...stuff...
        printf ("\nPlay again? (y\\n)\n");
        scanf("%c",&j);
    }
    while (j == 'y');
    return 0;
}

程序执行一次操作并退出,无需等待用户输入。运行一次后显示“按任意键继续”。如何解决这个问题?

4

3 回答 3

2

这通常意味着您的“东西”会在输入流中留下一些字符,这些字符可以scanf成功读取。由于缓冲区中的内容可能不是'y',因此循环终止。

一种解决方案是在执行scanf. 请参阅此处如何清除 C 中的输入缓冲区?

由于在许多情况下,缓冲区中剩余的数据通常是空格(如换行符),因此一种简单的解决方案可能是scanf(" %c", ...)(注意 之前的额外空格%c)甚至scanf("%s", ...). 在这两种情况下,挂起的空格都会被自动跳过。

于 2013-10-27T19:07:47.577 回答
1

getchar();在之后使用scanf()

即使您输入y然后Enter从键盘按下它也会转到scanf("%c",&j);语句并将'\n'字符存储到变量j中。所以你的 while 条件变成了假,从而退出了循环。

所以最终的程序将如下所示:

#include <stdio.h>

int main()
{
    int x, y, i, temp, sum;
    char j = 'y';
    do
    {
//        ...stuff...
        printf ("\nPlay again? (y\\n)\n");
        scanf("%c",&j);
        getchar(); // this will clear the ENTER you press from keyboard.
    }
    while (j == 'y');
    return 0;
}
于 2013-10-27T19:38:29.540 回答
0

您的游戏循环中可能有一些剩余输入(至少它看起来像您示例中的游戏循环),然后将其读入j变量。这就是为什么你会得到看起来是一次运行,没有输入,退出场景的原因。

要解决此问题,请尝试在再次播放提示之前刷新输入流。就像是:

fseek(stdin,0,SEEK_END);
于 2013-10-27T19:09:40.303 回答