我写了这个程序:
#include <conio.h>
#include <stdio.h>
void main()
{
char ch='a';
while(ch!='y'&&ch!='n')
{
printf("\nDo you want to print the output?(y/n)");
scanf("%c",&ch);
}
if(ch=='y')
printf("\n accepted!");
getch();
}
预期产出:
Do you want to print the output?(y/n)1
Do you want to print the output?(y/n)5
Do you want to print the output?(y/n)y
accepted!
相反,我得到:
Do you want to print the output?(y/n)
Do you want to print the output?(y/n)1
Do you want to print the output?(y/n)
Do you want to print the output?(y/n)5
Do you want to print the output?(y/n)
Do you want to print the output?(y/n)y
accepted!
我不知道为什么这句话&#34;你想打印输出吗?(是/否)&#34;在输出中写两次?
答案 0 :(得分:5)
Beacuse scanf
接受\n
字符并将其保留在缓冲区中。
要使用该角色,您可以使用:
scanf(" %c",&ch);
答案 1 :(得分:2)
这应该适合你:
(您必须删除所有'\n'
并在%c
)之前放置一个空格
(因为scanf将所有内容读取到\n
并且新行仍然在缓冲区中,所以在下一次迭代中,新行从scanf读取)
#include <conio.h>
#include <stdio.h>
void main()
{
char ch='a';
while(ch!='y'&&ch!='n')
{
printf("Do you want to print the output?(y/n)");
scanf(" %c",&ch);
}
if(ch=='y')
printf("accepted!");
getch();
}
所以你得到你的输出:
Do you want to print the output?(y/n)1
Do you want to print the output?(y/n)5
Do you want to print the output?(y/n)y
accepted!
答案 2 :(得分:0)
在你的函数中制作scanf。
scanf(" %c",&ch);
这样做的原因。当您输入该问题时,将按下时间输入。因此,当按下enter时,会放置换行符。所以scanf将换行符作为一个字符,然后循环将继续下一次。如果在控制字符串之前给出空格,它将跳过输入中的白线字符,然后询问输入。
答案 3 :(得分:0)
输入缓冲区问题。但是,解决方案非常简单:
而不是scanf(" %c",&ch);
,请使用:
do { ch=getchar(); } while(ch=='\n');