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都会把字符指针指向成功后下个位置。