1

我在练习 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;
            }
        }
    }
}
4

1 回答 1

0

rewind()当标准输入是终端时在标准输入上使用没有任何用处。你不能在终端上寻找。你不应该尝试使用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;
}

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

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 编译器允许在需要时定义变量,而不是要求在块开始时定义它们。{如果您使用的是过时的编译器,则可以将定义移到前面的后面。

警告:回答此问题时未编译任何代码。

于 2019-09-15T15:17:41.363 回答