猿问

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

#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”

qq_守夜人_11
浏览 2694回答 3
3回答

onemoo

我猜你在输入完 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 匹配正常字符了。

qq_虚伪的宋痞子_0

此1非彼1,此2非彼2
随时随地看视频慕课网APP
我要回答