为了账号安全,请及时绑定邮箱和手机立即绑定

为什么我的代码第一次运行没问题,第二次出毛病?

为什么我的代码第一次运行没问题,第二次出毛病?

C
qq_守夜人_11 2017-10-16 23:39:25
#include <stdio.h>int main(){    char a,b,c;    while(scanf("%c %c",&a,&b)!=EOF)    {        printf("%c\n",(char)(a+b));    }    return 0;}输入1 1 输出“b”接着输入2 2 应该输出“d”,但是输出“RR”
查看完整描述

3 回答

?
onemoo

TA贡献883条经验 获得超454个赞

我猜你在输入完 1 1 后敲了别的键吧? 是空格吗?

你试试连续输入 1122,结果应该就对了。


因为你输入的内容都在所谓的“输入缓冲区”中,scanf 从缓冲区中匹配读取。第一次循环 scanf 匹配完两个字符(1和1)后,你多按的那个键还留在缓冲区中。而刚好 %c 会匹配任何一个字符(包括控制字符)所以第二次 scanf 就把上次留下的那个字符匹配给了第一个 %c 并存到了 a 中。当然第二个 %d 会正常匹配到你输入的第一个 2,存入b中。

那么 a + b 肯定就不是字符 'd' 了。至于具体是什么取决于你在第一次输入的 11 后按了什么键。

而这时缓冲区中还剩下一个 2,所以 scanf 继续匹配...

你可以加上单独输出 a 和 b 值的语句来验证下:printf("a=%d  b=%d\n", a, b);


如果你就是想在每组输入多敲个键(回车、空格什么的)的话,也有办法解决。在 scanf 第一个参数格式化字符串的一开始放一个空格就好了:scanf(" %c %c",&a,&b)

这是因为 scanf 格式化字符串中的空白字符会匹配任何一个或多个输入中的空白字符(所谓空白字符包括空格、换行、tab等)。所以上次输入后剩下的那个按键会被格式化字符串一开头的这个空格匹配掉,句不影响后面 %c 匹配正常字符了。

查看完整回答
反对 回复 2017-10-17
  • qq_守夜人_11
    qq_守夜人_11
    我的两个%c中间有空格的,敲完1空格1后接着敲的回车
  • qq_守夜人_11
    qq_守夜人_11
    我想输入1空格1然后回车,它自动输出b 然后我继续输入2空格2回车,他自动输出d 这个该怎么实现?
  • onemoo
    onemoo
    是的,正是因为你在两组输入之间还按了别的键,所以第二次scanf执行时,第一个%c匹配到了这个额外的输入。 其实你输入每组中的两个数时不必须用空格间隔开,比如你连续输入1122都可以的。
点击展开后面2
?
qq_虚伪的宋痞子_0

TA贡献7条经验 获得超0个赞

此1非彼1,此2非彼2

查看完整回答
反对 回复 2017-10-17
  • 3 回答
  • 0 关注
  • 2537 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信