scanf字符问题

小菜一枚 2012-11-01 09:47:51
键盘输入:01<回车>后,程序运行的输出结果是hello-world-world,请大神们分析下这个结果是怎么得到的?
main()
{
char m;int i;
for(i=1;i<4;i++)
{
scanf("%c",&m);
switch(m)
{
case '0':
printf("hello-");
case '1':
printf("world-");
}
}
}
...全文
320 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
ridge.chang 2012-11-05
  • 打赏
  • 举报
回复
引用 1 楼 xiaoqin515515 的回复:
这里会出现两次word-是因为你的case语句没有break的原因,第一次m == 0, 输出hello-后会紧接着word-;第二次输入1时,m == 1,这时switch-case输出word-,第三次m == 回车(整数10),没有输出. 最后看到的就是hello-world-world 所以楼主,要时刻注意给你的swith-case语言加break
可以结贴了。。。。
sfz200809242719 2012-11-05
  • 打赏
  • 举报
回复
没有break
qq120848369 2012-11-03
  • 打赏
  • 举报
回复
回车符+没有break的原因。
码跑偏了 2012-11-02
  • 打赏
  • 举报
回复
switch 和break, 一般都配套用的,用了switch,就要想到break
hu7324829 2012-11-02
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 的回复:]

引用 1 楼 的回复:
这里会出现两次word-是因为你的case语句没有break的原因,第一次m == 0, 输出hello-后会紧接着word-;第二次输入1时,m == 1,这时switch-case输出word-,第三次m == 回车(整数10),没有输出.
最后看到的就是hello-world-world
所以楼主,要时刻注意给你的swith-case语言加break

……
[/Quote]
标准输入输出是带缓冲区的, scanf只是从缓冲区里取,取到空时结束。
01\n都在缓冲区里。
小菜一枚 2012-11-02
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 的回复:]
这里会出现两次word-是因为你的case语句没有break的原因,第一次m == 0, 输出hello-后会紧接着word-;第二次输入1时,m == 1,这时switch-case输出word-,第三次m == 回车(整数10),没有输出.
最后看到的就是hello-world-world
所以楼主,要时刻注意给你的swith-case语言加break
[/Quote]
感觉输入01回车后,这就是一次输入啊,怎么还有“第一次m == 0,第二次输入1时,m == 1,第三次m == 回车(整数10)"之说呢
yinlincheng 2012-11-02
  • 打赏
  • 举报
回复
对啊,没有break啊
Daybreak110 2012-11-02
  • 打赏
  • 举报
回复
没有break就会一直执行下去。
lzqxs89 2012-11-02
  • 打赏
  • 举报
回复
感谢楼主的问题让我长见识了。看到你的问题,我查了些资料,这有个解析很详细,应该可以解开楼主的疑惑。
http://zhidao.baidu.com/question/145325291.html?fr=qrl&index=3
希望楼主采纳,求分啊
  • 打赏
  • 举报
回复
你没有break啊
gaochizhen33 2012-11-02
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 的回复:]

引用 1 楼 的回复:
这里会出现两次word-是因为你的case语句没有break的原因,第一次m == 0, 输出hello-后会紧接着word-;第二次输入1时,m == 1,这时switch-case输出word-,第三次m == 回车(整数10),没有输出.
最后看到的就是hello-world-world
所以楼主,要时刻注意给你的swith-case语言加break

……
[/Quote]
虽然只输入了一次,但是你存储的时候m是字符型 只会使用一个字节,即只是用了'0','1'和'\n'都还在缓冲区里,等下次循环的时候直接读取缓冲区里边的数据。
JiMoKuangXiangQu 2012-11-01
  • 打赏
  • 举报
回复
没加break啊,呵呵,大家都说了.
zhaoming262350 2012-11-01
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 的回复:]

这里会出现两次word-是因为你的case语句没有break的原因,第一次m == 0, 输出hello-后会紧接着word-;第二次输入1时,m == 1,这时switch-case输出word-,第三次m == 回车(整数10),没有输出.
最后看到的就是hello-world-world
所以楼主,要时刻注意给你的swith-case语言加break
[/Quote]

main()
{
char m;int i;
for(i=1;i<4;i++)
{
scanf("%c",&m);
switch(m)
{
case '0':
printf("hello-");
case '1':
printf("world-");
}
}
}
这样你看输出就明白了:
dpdp_2012 2012-11-01
  • 打赏
  • 举报
回复
输入01回车后
第一个m是'0' 因为你的case里面没有break,所以输出hello-world-
第二个m是'1',输出world-
第三个m是'\n',什么都不输出
综上输出 hello-world-world-
慧钦 2012-11-01
  • 打赏
  • 举报
回复
这里会出现两次word-是因为你的case语句没有break的原因,第一次m == 0, 输出hello-后会紧接着word-;第二次输入1时,m == 1,这时switch-case输出word-,第三次m == 回车(整数10),没有输出.
最后看到的就是hello-world-world
所以楼主,要时刻注意给你的swith-case语言加break

69,371

社区成员

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

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