无法使用 fflush(stdin) 清除 stdin,在使用 getchar() 之后,在无限循环中 C prog
Can't clear the stdin using fflush(stdin), after using getchar(), in an infinite for loop C prog
我刚开始使用 C 编程,当我尝试编写一个只接受 y 或 n 个字符的程序时,我遇到了
#include <stdio.h>
#include <stdlib.h>
int main()
{
char ch;
printf("Do you want to continue\n");
for (;;)
{
ch=getchar();
if (ch=='Y' || ch=='y')
{
printf("Sure!\n");
break;
}
else if (ch=='N'||ch=='n')
{
printf("Alright! All the best!\n");
break;
}
else
{
printf("You need to say either Yes/No\n");
fflush(stdin);
}
}
return(0);
}
当我 运行 此代码,并输入 Y/y 或 N/n 以外的任何其他字符时,我收到最后一个 printf 语句(您需要说 Yes/No) 作为输出两次。
我知道发生这种情况是因为它认为输入,即 '\n' 作为另一个字符。
使用 fflush 没有帮助,因为它是一个无限循环。
我还能如何修改它以使最后一条语句只显示一次?
您可以使用循环来读取使用 getchar()
:
留下的任何字符
ch=getchar();
int t;
while ( (t=getchar())!='\n' && t!=EOF );
ch
的类型应该 int
为 getchar()
returns 和 int
。您还应该检查 ch
是否为 EOF
。
fflush(stdin)
是每个 C 标准的未定义行为。虽然,它是 defined 对于某些 platforms/compilers 例如 Linux 和 MSVC,你应该在任何可移植代码中避免它。
另一种选择 - 使用 scanf
忽略空格。
而不是ch=getchar();
,只需要scanf( " %c", &ch );
有了这个你也可以去掉fflush(stdin);
就像我评论中所说的那样,您应该使用 int ch
而不是 char ch
,因为 getchar
的 return 类型是 int
。
要清理 stdin
,您可以执行以下操作:
#include <stdio.h>
#include <stdlib.h>
int main(void){
int ch,cleanSTDIN;
printf("Do you want to continue\n");
for (;;)
{
ch = getchar();
while((cleanSTDIN = getchar()) != EOF && cleanSTDIN != '\n');
if (ch=='Y' || ch=='y')
{
printf("Sure!\n");
break;
}
else if (ch=='N'||ch=='n')
{
printf("Alright! All the best!\n");
break;
}
else
{
printf("You need to say either Yes/No\n");
}
}
return(0);
}
任何一种方法都可能会为您完成工作:
#include <stdio.h>
#include <stdlib.h>
int main(void){
char ch;
int check;
do {
printf("Do you want to continue: ");
if ((scanf("%c",&ch)) == 1){
while((check=getchar()) != EOF && check != '\n');
if ((ch == 'y') || (ch == 'Y')){
printf("Alright! All the best!\n");
break;
} else if((ch == 'n') || (ch == 'N')){
printf("You choosed %c\n",ch);
break;
}else{
printf("You need to say either Yes/No\n");
}
}else{
printf("Error");
exit(1);
}
}while (1);
return 0;
}
输出1:
Do you want to continue: g
You need to say either Yes/No
Do you want to continue: y
Alright! All the best!
输出2:
Do you want to continue: n
You choosed n
或者我们可以简单地在最后一个 printf()
.
之后使用另一个 break;
语句
我刚开始使用 C 编程,当我尝试编写一个只接受 y 或 n 个字符的程序时,我遇到了
#include <stdio.h>
#include <stdlib.h>
int main()
{
char ch;
printf("Do you want to continue\n");
for (;;)
{
ch=getchar();
if (ch=='Y' || ch=='y')
{
printf("Sure!\n");
break;
}
else if (ch=='N'||ch=='n')
{
printf("Alright! All the best!\n");
break;
}
else
{
printf("You need to say either Yes/No\n");
fflush(stdin);
}
}
return(0);
}
当我 运行 此代码,并输入 Y/y 或 N/n 以外的任何其他字符时,我收到最后一个 printf 语句(您需要说 Yes/No) 作为输出两次。 我知道发生这种情况是因为它认为输入,即 '\n' 作为另一个字符。 使用 fflush 没有帮助,因为它是一个无限循环。 我还能如何修改它以使最后一条语句只显示一次?
您可以使用循环来读取使用 getchar()
:
ch=getchar();
int t;
while ( (t=getchar())!='\n' && t!=EOF );
ch
的类型应该 int
为 getchar()
returns 和 int
。您还应该检查 ch
是否为 EOF
。
fflush(stdin)
是每个 C 标准的未定义行为。虽然,它是 defined 对于某些 platforms/compilers 例如 Linux 和 MSVC,你应该在任何可移植代码中避免它。
另一种选择 - 使用 scanf
忽略空格。
而不是ch=getchar();
,只需要scanf( " %c", &ch );
有了这个你也可以去掉fflush(stdin);
就像我评论中所说的那样,您应该使用 int ch
而不是 char ch
,因为 getchar
的 return 类型是 int
。
要清理 stdin
,您可以执行以下操作:
#include <stdio.h>
#include <stdlib.h>
int main(void){
int ch,cleanSTDIN;
printf("Do you want to continue\n");
for (;;)
{
ch = getchar();
while((cleanSTDIN = getchar()) != EOF && cleanSTDIN != '\n');
if (ch=='Y' || ch=='y')
{
printf("Sure!\n");
break;
}
else if (ch=='N'||ch=='n')
{
printf("Alright! All the best!\n");
break;
}
else
{
printf("You need to say either Yes/No\n");
}
}
return(0);
}
任何一种方法都可能会为您完成工作:
#include <stdio.h>
#include <stdlib.h>
int main(void){
char ch;
int check;
do {
printf("Do you want to continue: ");
if ((scanf("%c",&ch)) == 1){
while((check=getchar()) != EOF && check != '\n');
if ((ch == 'y') || (ch == 'Y')){
printf("Alright! All the best!\n");
break;
} else if((ch == 'n') || (ch == 'N')){
printf("You choosed %c\n",ch);
break;
}else{
printf("You need to say either Yes/No\n");
}
}else{
printf("Error");
exit(1);
}
}while (1);
return 0;
}
输出1:
Do you want to continue: g
You need to say either Yes/No
Do you want to continue: y
Alright! All the best!
输出2:
Do you want to continue: n
You choosed n
或者我们可以简单地在最后一个 printf()
.
break;
语句