关于getchar()的用法

橙子爱柚子 2017-04-10 03:33:24
学习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()还有必要吗?如果必要为什么说是吃掉回车?
...全文
1663 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
赵4老师 2017-07-26
  • 打赏
  • 举报
回复
在每个最后不带\n的printf后面加fflush(stdout);
在每个不想受接收缓冲区旧内容影响的scanf前面加rewind(stdin);
另外请检查scanf的返回值。
[code=c]//请今后要用
char c;
scanf("%c",&c);
//时,都改为
char s[2];
char c;
scanf("%1s",s);
c=s[0];
//自动跳过一个或多个空格或Tab字符或回车换行,读取下一个字符。
[/code]
Vincent-123 2017-07-25
  • 打赏
  • 举报
回复
标准输入流中带有缓存,最后scanf只是把除了回车符之外的其他字符都吃了,scanf语句执行完之后,缓存里面还是有个回车符,随意要用getchar()来吃掉回车符。 你这样想,getchar()是阻塞的,这个库函数应该等着你在键盘输入字符后才会执行完,为什么你在终端值等到sancf这个语句让你输入字符,而getchar()这条语句就直接过去了。
destory27 2017-07-22
  • 打赏
  • 举报
回复
(stdin)
destory27 2017-07-22
  • 打赏
  • 举报
回复
fflush(sdin);
赵4老师 2017-04-11
  • 打赏
  • 举报
回复
在每个最后不带\n的printf后面加fflush(stdout); 在每个不想受接收缓冲区旧内容影响的scanf前面加rewind(stdin); 另外请检查scanf的返回值。
//请今后要用
char c;
scanf("%c",&c);
//时,都改为
char s[2];
char c;
scanf("%1s",s);
c=s[0];
Nerute 2017-04-10
  • 打赏
  • 举报
回复
这是关于scanf函数缓冲区的问题,当你从键盘输入完数据之后,敲下回车,结果换行符被放入了缓冲区中,只不过因为输入格式是以%某某,所以换行符 不起作用,所以这里的getchar可以说是多余的,不过当输入格式不是以%×××,那么回车符就当作一个字符,进行匹配,赋值,那么这里的getchar就是为了防止回车符匹配成功后造成的问题,就是相当于用getchar读取上一步输入的回车符,getchar也是有缓冲区的,若缓冲区没有数据会等待用户输入,而上一步留下来的回车符在缓冲区内,所以getchar直接读取它,最后说一句,因为再此程序中,回车符匹配不成功,所以getchar在这里同样没什么鸟用的哦哦。
求值者 2017-04-10
  • 打赏
  • 举报
回复
你除了输入需要的数据外还按了一个回车,这个回车如果是后续还有输入就会产生影响, getchar()确实是来吃掉这个回车用的,注意 后续的输入如果是%c有影响,%d还是没有影响的,因为%d不可读取回车
幻夢之葉 2017-04-10
  • 打赏
  • 举报
回复
这里不需要用,因为你后续再也没有读取的操作了,所以那个回车键是否被清除出输入流无关紧要 但是你后续如果有读取 字符/字符串的操作 的时候需要注意这个问题。
自信男孩 2017-04-10
  • 打赏
  • 举报
回复
是吃掉最后输入的回车符。原因是这个输入你只输入一次,若需要输入多次(>=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;
}
试一下这个,加上和不加的区别。

69,379

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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