关于c语言的getchar的缓冲

getchar函数原型

    int getchar(void)

 

今天c primer plus 第8章的时候遇到一个例子:

 

当输入 c 2 2时将输出:

cc

cc

开始我觉得代码没什么问题,出现了书中的结果,但是自己看了下代码,发现很多疑惑的地方:

    1、while循环只执行了一次

    2、scanf是如何获取到row,cols的

 

baidu之,不要鄙视,习惯了,google经常打不开,囧

 

getchar 由宏实现:#define getchar() fgetc(stdin)。getchar有一个int型的返回值.当程序调用getchar时.程序就等着用户按键.用户输入的字符被存放在键盘缓冲区中.直到用户按回车为止(回车字符也放在缓冲区中).当用户键入回车之后,getchar才开始从stdio流中每次读入一个字符.getchar函数的返回值是用户输入的第一个字符的ASCII码,如出错返回-1,且将用户输入的字符回显到屏幕.如用户在按回车之前输入了不止一个字符,其他字符会保留在键盘缓存区中,等待后续getchar调用读取.也就是说,后续的getchar调用不会等待用户按键,而直接读取缓冲区中的字符,直到缓冲区中的字符读完为后,才等待用户按键.

 

问题1:

    也就是说当我们输入c 2 2时会先把他们存放在缓冲区,然后在执行while循环 ,为什么是一次呢? 那是因为scanf函数,scanf("%d %d");获取2个数字,最后留下了换行符,也就是说第一次ch='c',第二次ch='/n',如果在2后面加一个空格,就会继续循环下去。OK 第一个问题搞定。

问题2:

  scanf但是为什么不获取的是c 2 呢,目前我只能理解成当执行ch=getchar()执行成功时时会将输入字符串的指针向后移动," 2 2"这样scanf就获取参数成功 执行完退出,OK 这2个问题暂时搞定(刚学c只能这样理解拉,如有错误,还请高手指点一二)。

 

   其实2个问题都可以归结为一个问题,缓冲区,不管是getchar,还是scanf都会把字符指针指向成功后下个位置。

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值