忽略在while循环中的第二次运行,C
当我第二次尝试运行此循环时,它会打印“输入一个句子”,但跳过忽略在while循环中的第二次运行,C,c,C,当我第二次尝试运行此循环时,它会打印“输入一个句子”,但跳过get部分。不稳定地询问答案,以便再次运行循环。我可以使用scanf如果没有问题,我需要空白 程序将看起来像 输入一句话:你 你 再来一次?是/否:是 不错的选择 输入一句话: 再来一次?是/否: int main(void){ char user_input[20]; int boolean = 0; char val[2]; do{ printf("Enter a sentence: ");
get
部分。不稳定地询问答案,以便再次运行循环。我可以使用scanf
如果没有问题,我需要空白
程序将看起来像
输入一句话:你
你
再来一次?是/否:是
不错的选择
输入一句话:
再来一次?是/否:
int main(void){
char user_input[20];
int boolean = 0;
char val[2];
do{
printf("Enter a sentence: ");
gets(user_input);
printf("%s\n", user_input);
printf("One more time? y/n: ");
scanf("%c", &val[0]);
if(val[0] == 'y'){
boolean = 1;
printf("Good choice!\n");
}else if(val[0] == 'n'){
printf("You are really quiting?\n");
boolean = 0;
}
}while(boolean);
return 0;
}
输入y/n的ans时,scanf()接受字符,换行符由get()接受。。 您的代码需要这样做一点修改
int main(void)
{
char user_input[20];
int boolean = 0;
char val[2];
do{
printf("Enter a sentence: ");
gets(user_input);
printf("%s\n", user_input);
printf("One more time? y/n: ");
scanf("%c", &val[0]);
getchar();
if(val[0] == 'y')
{
boolean = 1;
printf("Good choice!\n");
}
else if(val[0] == 'n')
{
printf("You are really quiting?\n");
boolean = 0;
}
}while(boolean);
return 0;
}
getchar()函数接受换行符…因此,gets()不接受换行符,并且不会发生错误…这是因为您的stdin缓冲区中仍有新行字符,因此“gets”接受换行符
该换行符作为输入,您没有机会输入您的换行符。
在scanf之后使用getchar()读取换行符,如:
scanf("%c", &val[0]);
getchar();
或者,您可以在scanf功能内进行一些调整:
scanf("\n%c", &val[0]); // insert a newline character in the beginning.
在扫描出
y/n
答案之后,输入流中可能仍然有一个换行符。因为它仍然在那里,当它出现时,它只会从缓冲器中得到一个新行,并考虑输入完成。没有工作,我在“进入句子”之前先划出新的线,这是无关的。那是斯道特。用户点击Y
FYI:gets
时,stdin中仍然会出现一条新行:gets
太糟糕了,甚至被C99标准抛弃了(尽管他们都是为了向后兼容的坚持者,这是正确的)。关于它,你需要知道的唯一一件事就是“永远不要使用它!”@Khairlbasar:如果你阅读手册页,它会清楚地在bug标签下写着“永远不要使用gets”。获取并不是最好的方法。您可以使用“fgets”来读取字符串。注意:scanf(“%c”,&val[0])代码>与scanf(“\n%c”,&val[0])具有相同的效果代码>:在将char
扫描到val[0]
之前,使用可选的前导空格,