A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 冯立柱 于 2014-3-13 21:42 编辑

本人目前还在学习C语言,刚刚看到位运算,晚上尝试写了这么一段程序,请大家批评。
我想请教一下大家,为什么我最后输入“·”,代表结束时,会再次打印一次结果,怎么能消除?同时请大家提点意见。
谢谢!

问题.jpg (143.97 KB, 下载次数: 14)

问题.jpg

评分

参与人数 1技术分 +1 收起 理由
jing迪 + 1

查看全部评分

4 个回复

倒序浏览
本帖最后由 lixiangzhou 于 2014-3-8 22:03 编辑

当你输完 1@3= 时,会找到scanf("%lf%c%lf%c", &a, &c, &b, &d)函数,执行结果是:
a = 1.000000, c = '@', b = 3.000000, d = ''; e = '';  //  e是空值
当输入 · 时,由于 · 不是double类型的值,而是char类型的值,就回去找 scanf("%c", &e)函数,此时e='·',但流程并没有转到 scanf("%c", &e);那一行,而是在scanf("%lf%c%lf%c", &a, &c, &b, &d);这行。
此时各变量的值:
a = 1.000000, c = '@', b = 3.000000, d = ''; e = '·';
由于c='@',输出-> 输入错误。而e='·',则退出循环。





评分

参与人数 1技术分 +1 收起 理由
jing迪 + 1

查看全部评分

回复 使用道具 举报
你把最后的if 语句去掉试试。  应该是这里的问题   还有 你传的图片字体太小了  看的眼疼!

评分

参与人数 1技术分 +1 收起 理由
jing迪 + 1

查看全部评分

回复 使用道具 举报
当你输入1@3=时,此时因为c=='@',所以打印输入错误。因为你在输入“1@3=”之后按下了回车,就是那个换行符'\n' ,scanf("%lf%c%lf%c", &a, &c, &b, &d)并没有读取,,还保留在输入流中。因此,当scanf("%c", &e)执行时其实是读取了输入流中的换行符,即此时e == '\n'。所以此时程序又循环一次,等待在第一个scanf函数那,等待你的输入。当你输入‘.'时,因为第一个scanf函数的第一个参数是%lf。因为'.'是char类型,因为不匹配,所以不会读取。扔保存在输入流中。当执行到scanf("%c", &e)时,读取'.'并赋值给e。退出while循环。
注意:其实在你前面的输入时,scanf("%c", &e)每次读取都是一个换行符。因为每次输入,scanf("%lf%c%lf%c", &a, &c, &b, &d)都会遗留一个换行符在输入流中。因此,当执行scanf("%c", &e)时,其实你还没开始输入,他就已经执行完了。因为已经从输入流中读入了一个'\n'。而重新开始循环。
所以当有连续两个scanf函数时,要特别注意一下。要解决这个问题。你可以在第二个scanf函数之前。加入这条语句:
  1. fflush(stdin);
复制代码

这条语句的作用是清空输入缓冲区,为了确保不影响第二个scanf函数的读取。将前面的输入流给清空。而且第二个scanf后你必须你要加上fflush(stdin);防止循环时,第一个scanf又读取第二个scanf留下的垃圾字符。但是这样改了还是有问题。这样你必须每次都要等待从终端输入一个字符。然后判断是不是'.'。这样终端上就会因为要执行第二个scanf函数,给e赋值而显示一些没用的字符。但题主输入格式又是这样。我也就没什么办法了。而且当输入某些不是理想中的数字时,程序可能会出现各种奇怪的问题。:lol:lol

评分

参与人数 1黑马币 +10 收起 理由
冯立柱 + 10

查看全部评分

回复 使用道具 举报
conpgy 发表于 2014-3-9 20:41
当你输入1@3=时,此时因为c=='@',所以打印输入错误。因为你在输入“1@3=”之后按下了回车,就是那个换行符 ...

谢谢你的回答,虽然我的脑子还没转过来,但我会根据你说的仔细思考一下  谢谢了
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马