为什么我的代码不倒带并将输入保留在缓冲区中?

Why does my code not rewind and keep the inputs in the buffer?

这段代码是我在练习C语言的时候写的。但显然这段代码不会倒带输入。所以当我输入一些不同于 int 的数据类型时,应该返回到 while 循环的开头并再次开始问题。但它并没有这样做,而是无限地打印东西。似乎它不会倒带缓冲区中的内容。我想知道为什么会那样做。而且我使用在线编译器,因为我的环境不允许下载Visual Studio或任何编译器。

void main()
{
    char account[64];
    char password[64];
    int i, rAns;
    while (1)
    {
        printf("1.already a member? Log in\n");
        printf("2.register\n");

        if (scanf("%d", &rAns) == 0)
        {
            printf("enter right answer\n");
            rewind(stdin);
        }

        else
        {
            if (rAns < 1 || rAns > 2)
            {
                printf("enter one of the options\n");
            }
            else
            {
                break;
            }
        }
    }
}

当标准输入是终端时,在标准输入上使用 rewind() 没有任何用处。你不能在终端上搜索。你也不应该尝试 using fflush(stdin)

当您返回 0 时,导致失败的字符仍在输入流中。至少,您需要阅读该字符;不过,通常情况下,最好阅读该行的其余部分,因为如果您再次提示用户然后处理他们之前输入的其余内容,他们会感到困惑。

这意味着您需要更多类似的东西:

int main(void)
{
    char account[64];
    char password[64];
    int i, rAns;
    while (1)
    {
        printf("1.already a member? Log in\n");
        printf("2.register\n");

        if (scanf("%d", &rAns) == 0)
        {
            printf("enter right answer (1 or 2)\n");
            int c;
            while ((c = getchar()) != EOF && c != '\n')
                ;
        }
        else if (rAns < 1 || rAns > 2)
        {
            printf("enter one of the options (1 or 2)\n");
        }
        else
        {
            break;
        }
    }
    return 0;
}

您还应该检测主 scanf() 上的 EOF。这需要:

int main(void)
{
    char account[64];
    char password[64];
    int i, rAns;
    while (1)
    {
        printf("1.already a member? Log in\n");
        printf("2.register\n");

        int rc;
        if ((rc = scanf("%d", &rAns)) == EOF)
            break;
        else if (rc == 0)
        {
            printf("enter right answer (1 or 2)\n");
            int c;
            while ((c = getchar()) != EOF && c != '\n')
                ;
        }
        else if (rAns < 1 || rAns > 2)
        {
            printf("enter one of the options (1 or 2)\n");
        }
        else
        {
            break;
        }
    }
    return 0;
}

额外的代码假定 C99 编译器允许在需要时定义变量,而不是要求它们在块的开头定义。如果您使用的是过时的编译器,则可以将定义移到前面的 { 之后。

警告:回答这个问题时没有编译代码。