c语言里scanf问题

microsoft911 2010-04-02 05:23:33
大家好:

先贴一段代码
#include <stdio.h>

int main(){
char ch;
for(int i=0; i<5;i++)
{
//scanf("%c",&ch);
ch=getchar();
if(ch=='y')
printf("yes\n");
else
printf("No\n");

ch='x';
}
return 0;
}
输出结果
y回车
yes
No
y回车
yes
No
y回车
yes
Press any key to continue . . .

我想要的输出时一共可以写 y 加回车 5 次, 每次都显示 yes, 但是结果却不是,在线等解答。
...全文
284 23 打赏 收藏 转发到动态 举报
写回复
用AI写文章
23 条回复
切换为时间正序
请发表友善的回复…
发表回复
microsoft911 2010-04-13
  • 打赏
  • 举报
回复
这样不行的,你有没有试过?
[Quote=引用 20 楼 xuyuanfan77 的回复:]

回车也是一个字符啊!它会当成一个字符来处理的,
//scanf("%c",&ch);
ch=getchar();
改为:
scanf("%c\n",&ch);
就可以了
[/Quote]
wuweiqi 2010-04-07
  • 打赏
  • 举报
回复
因为getchar()从缓冲区里取‘y’之后取了‘\n’,所以输出结果为:y回车yes 和No,请用fflush(stdin)清理缓冲区;
yangguan0104 2010-04-07
  • 打赏
  • 举报
回复
cin>>&ch
用这个输入
  • 打赏
  • 举报
回复
回车也是一个字符啊!它会当成一个字符来处理的,
//scanf("%c",&ch);
ch=getchar();
改为:
scanf("%c\n",&ch);
就可以了
fubaodian 2010-04-06
  • 打赏
  • 举报
回复
以前也有同样的烦恼,现在明白了
andychinajj 2010-04-06
  • 打赏
  • 举报
回复
学到了!
soulzbg 2010-04-06
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 ccccdddxxx 的回复:]
1不知道楼主加个getchar函数,没意义,有它,就发生啦错误。
2for (int i=0 ;i<5 ;i++)这个使用,不知道是什么风格,我使用mingw检测语法错误,正确:
int i ;
for (i=0 ;i<5;i++);
[/Quote]
嗯,总感觉getchar和scanf在一起的时候很别扭!
louyong0571 2010-04-06
  • 打赏
  • 举报
回复
恩,键盘缓冲的问题,当年也很烦恼
wade_2003 2010-04-06
  • 打赏
  • 举报
回复
在用scanf的时候,每次都会用getchar()的
fay8048 2010-04-05
  • 打赏
  • 举报
回复
1不知道楼主加个getchar函数,没意义,有它,就发生啦错误。
2for (int i=0 ;i<5 ;i++)这个使用,不知道是什么风格,我使用mingw检测语法错误,正确:
int i ;
for (i=0 ;i<5;i++);
匚匚 2010-04-04
  • 打赏
  • 举报
回复
scanf(" %c", &ch); //抵消前次输入的回车

fflush(stdin); //清空缓冲区,因为前次输入的回车还在缓冲区内。如不清空函数会首先读取它
异界工程师 2010-04-03
  • 打赏
  • 举报
回复
#include <stdio.h>

int main(){
char ch;
for(int i=0; i<5;i++)
{
//scanf("%c",&ch);
ch=getchar();
getchar();
if(ch=='y')
printf("yes\n");
else
printf("No\n");

ch='x';
}
return 0;
}
这样也行的,再用一个getchar();接受回车键。。。就可以实现你的要求了。。。其实上面几楼的也是可以做到的,而且还挺棒的。。。
喜-喜 2010-04-02
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 huanmie_09 的回复:]
你的问题在于每次你输入一个字符,键盘缓冲区里都会保留一个回车符。
如你的结果:
输出结果
y回车
yes
No
y回车
yes
No
y回车
yes
Press any key to continue . . .
当你输入y回车时,getchar()函数读取键盘缓冲区的'y',这时输出yes,而下一次第二次循环的时候,getchar()函数将会直接读取键盘缓冲区里的回车符,……
[/Quote]


ding...



#include <stdio.h>

int main(){
char ch;
for(int i=0; i<5;i++)
{
//scanf("%c",&ch);
ch=getchar();
if(ch=='y')
{
printf("yes\n");
getchar();//这里加个getchar();
}
else
printf("No\n");
}
getchar();
return 0;
}
chaoliu1024 2010-04-02
  • 打赏
  • 举报
回复
#include <stdio.h>

int main(void){
char ch;
for(int i=0; i<5;i++)
{
//scanf("%c",&ch);
ch=getchar();
fflush(stdin); // 清除缓冲区
if(ch=='y')
printf("yes\n");
else
printf("No\n");

ch='x';
}
return 0;
}

这样也可以的,关键是要清楚缓冲区!因为“回车符”也会被当成字符输进去的。这是一个很经典的错误!
McFate 2010-04-02
  • 打赏
  • 举报
回复
也可以用scanf("%1s",&ch),%s不吸收空格、回车的
huanmie_09 2010-04-02
  • 打赏
  • 举报
回复
你的问题在于每次你输入一个字符,键盘缓冲区里都会保留一个回车符。
如你的结果:
输出结果
y回车
yes
No
y回车
yes
No
y回车
yes
Press any key to continue . . .
当你输入y回车时,getchar()函数读取键盘缓冲区的'y',这时输出yes,而下一次第二次循环的时候,getchar()函数将会直接读取键盘缓冲区里的回车符,这时输出No.
然后键盘缓冲区里为空,下一次循环继续接受键盘输入,再次输入y回车,处理过程同前面的一样.
解决方法上面几楼都已经讲了。
microsoft911 2010-04-02
  • 打赏
  • 举报
回复
回ccnyou:
不错,能否再具体点,等下就散分。
microsoft911 2010-04-02
  • 打赏
  • 举报
回复
请教canoe982:
我试了下成功了,可是为什么呢? 之前我调试的时候出错的时候 ch=10 的, 我在acsii里查实nl的意思,是new line的意思。 为什么加了空格就好了?
ccnyou 2010-04-02
  • 打赏
  • 举报
回复
改成
#include <stdio.h
>
int main(){

char ch;
for(int i=0; i<5;i++){

//scanf("%c",&ch);
ch=getchar();
if(ch=='y')printf("yes\n");


rewind(stdin);
//或加句getchar();主要是缓冲区问题

ch=getchar();
if(ch=='y')printf("yes\n");
else
printf("No\n");
ch='x';
}
return 0;
}输出结果
加载更多回复(3)

69,371

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧