消息关闭
    暂无新消息!

关于getchar()的用法

问题作者 : 到处飘2017-07-23发布
学习c语言遇到一个困惑。有道题:
输入H123i45,输出Hi168。
int main(void)
{
char chA,chB;
int a,b;
scanf("%c%3d%c%2d",&chA,&a,&chB,&b);
getchar();
b+=a;
printf("%c%c",chA,chB);
printf("%d\n",b);
}
上面的getchar();答案说是吃掉回车,但是我不加结果也一样,那么这个getchar()还有必要吗?如果必要为什么说是吃掉回车?

6个回答

︿ 1
是吃掉最后输入的回车符。原因是这个输入你只输入一次,若需要输入多次(>=2)就会有问题,就能看出getchar()的需要了。
#include <stdio.h>


int main(void)
{
    char chA,chB;
    int a,b;
    int i = 0;

    while (i < 3) {
        scanf("%c%3d%c%2d",&chA,&a,&chB,&b);
        //getchar();
        b += a;
        printf("%c%c",chA,chB);
        printf("%d\n",b);
        i++;
    }

    return 0;
}

试一下这个,加上和不加的区别。
︿ 0
这里不需要用,因为你后续再也没有读取的操作了,所以那个回车键是否被清除出输入流无关紧要

但是你后续如果有读取 字符/字符串的操作 的时候需要注意这个问题。
︿ 0
在每个最后不带\n的printf后面加fflush(stdout);
在每个不想受接收缓冲区旧内容影响的scanf前面加rewind(stdin);
另外请检查scanf的返回值。
//请今后要用
char c;
scanf("%c",&c);
//时,都改为
char s[2];
char c;
scanf("%1s",s);
c=s[0];

︿ 0
这是关于scanf函数缓冲区的问题,当你从键盘输入完数据之后,敲下回车,结果换行符被放入了缓冲区中,只不过因为输入格式是以%某某,所以换行符 不起作用,所以这里的getchar可以说是多余的,不过当输入格式不是以%×××,那么回车符就当作一个字符,进行匹配,赋值,那么这里的getchar就是为了防止回车符匹配成功后造成的问题,就是相当于用getchar读取上一步输入的回车符,getchar也是有缓冲区的,若缓冲区没有数据会等待用户输入,而上一步留下来的回车符在缓冲区内,所以getchar直接读取它,最后说一句,因为再此程序中,回车符匹配不成功,所以getchar在这里同样没什么鸟用的哦哦。
︿ 0
你除了输入需要的数据外还按了一个回车,这个回车如果是后续还有输入就会产生影响, getchar()确实是来吃掉这个回车用的,注意 后续的输入如果是%c有影响,%d还是没有影响的,因为%d不可读取回车