为什么我的代码不倒带并将输入保留在缓冲区中?
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 编译器允许在需要时定义变量,而不是要求它们在块的开头定义。如果您使用的是过时的编译器,则可以将定义移到前面的 {
之后。
警告:回答这个问题时没有编译代码。
这段代码是我在练习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 编译器允许在需要时定义变量,而不是要求它们在块的开头定义。如果您使用的是过时的编译器,则可以将定义移到前面的 {
之后。
警告:回答这个问题时没有编译代码。