C,做什么不起作用,

时间:2013-10-27 19:05:30

标签: c do-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);
    }
    while (j == 'y');
    return 0;
}

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

3 个答案:

答案 0 :(得分:2)

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

一种解决方案是在执行scanf之前刷新输入流。见How to clear input buffer in C?

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

答案 1 :(得分: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;
}

答案 2 :(得分:0)

游戏循环中可能存在一些残余输入(至少它看起来像是你的例子中的游戏循环),然后被读入j变量。这就是为什么你得到的似乎是一次运行,没有输入,退出场景。

要解决此问题,请尝试在再次进入播放提示之前刷新输入流。类似的东西:

fseek(stdin,0,SEEK_END);