程序遇到scanf直接跳过不执行这是为什么

newcleaner 2014-11-28 09:20:43
苦逼自学者,刚开始学C,不太明白下面这段代码为什么不执行scanf函数,请高手指点一下。就算程序逻辑有问题,程序遇到scanf也应该让我输入一下再出错也好啊,但是它直接跳过不执行。泪奔了。

//计算面积或体积
#include <stdio.h>

int main()
{
char choose = 'c'; //选择计算方式,提供a、b两种选项

float a = 5.0f; //长
float b = 6.0f; //宽
float h = 7.0f; //高

int on = 1; //循环开关,初始为打开
char yesorno = 'n'; //是否再次计算,初始为关闭
while (on)
{
printf("请选择\n");
printf("a>计算面积\n");
printf("b>计算体积\n->");

scanf("%c", &choose);
switch (choose)
{
case 'a':
case 'A':
printf("%f\n", a*b);
break;
case 'b':
case 'B':
printf("%f\n", a*b*h);
break;
default:
printf("不能识别你的输入!\n");
continue;
}
printf("是否需要再次计算(y/n):");

scanf("%c", &yesorno); //就是这个输入,始终不执行。不止为什么?
if (yesorno == 'N' ||
yesorno == 'n')
on = 0; //选择否,循环开关关闭
else if (yesorno == 'y' ||
yesorno == 'Y')
on = 1; //选择是,循环开关继续开启
else
on = 0; //乱输入则关闭循环,不再执行计算
}
return 0;
}
...全文
1216 5 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
tuke2010 2014-11-30
  • 打赏
  • 举报
回复 1
在%c前面加个空格也解决这个问题
newcleaner 2014-11-30
  • 打赏
  • 举报
回复 1
引用 3 楼 zhao4zhong1 的回复:
在每个最后不带\n的printf后面加fflush(stdout); 在每个不想受接收缓冲区旧内容影响的scanf前面加rewind(stdin); 另外请检查scanf的返回值。 试问写书的人有几个真正编程验证过呢? 不要迷信书、考题、老师、回帖; 要迷信CPU、编译器、调试器、运行结果。 并请结合“盲人摸太阳”和“驾船出海时一定只带一个指南针。”加以理解。 任何理论、权威、传说、真理、标准、解释、想象、知识……都比不上摆在眼前的事实! 有人说一套做一套,你相信他说的还是相信他做的? 其实严格来说这个世界上古往今来所有人都是说一套做一套,不是吗? 不要写连自己也预测不了结果的代码!
谢谢,刚开始学,基础知识不看不行啊。。等基本知识学会了,就应该可以“尽信书不如无书了”。看来以后要更多得联系和验证。谢谢。
newcleaner 2014-11-28
  • 打赏
  • 举报
回复
引用 1 楼 ZhaDeNianQu 的回复:
在该行前面 加一行代码,清空缓存即可: fflush(stdin); scanf("%c", &yesorno);
谢谢,加上fflush(stdin);以后这句scanf好了,但上面还有一个scanf又使程序出现不输入直接跳过问题了,我在两个scanf前面都加上就没有问题了。 可是,我看书上很多scanf都随便用,没有添加这句。为什么一到我用就非得加上才行。头大! 也许我还得看更多的书才行啊。 谢谢您的解答!
猿说编程 2014-11-28
  • 打赏
  • 举报
回复
在该行前面 加一行代码,清空缓存即可: fflush(stdin); scanf("%c", &yesorno);
赵4老师 2014-11-28
  • 打赏
  • 举报
回复
在每个最后不带\n的printf后面加fflush(stdout); 在每个不想受接收缓冲区旧内容影响的scanf前面加rewind(stdin); 另外请检查scanf的返回值。 试问写书的人有几个真正编程验证过呢? 不要迷信书、考题、老师、回帖; 要迷信CPU、编译器、调试器、运行结果。 并请结合“盲人摸太阳”和“驾船出海时一定只带一个指南针。”加以理解。 任何理论、权威、传说、真理、标准、解释、想象、知识……都比不上摆在眼前的事实! 有人说一套做一套,你相信他说的还是相信他做的? 其实严格来说这个世界上古往今来所有人都是说一套做一套,不是吗? 不要写连自己也预测不了结果的代码!

33,320

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 新手乐园
社区管理员
  • 新手乐园社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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