关于c语言的getchar的缓冲

getchar函数原型

    int getchar(void)

 

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

#include <stdio.h> void display(char c,int line,int width); main(void){ char ch; /* 要打印的字符 */ int rows,cols; printf("Enter a character and two integers: /n"); while( (ch=getchar()) != '/n' ){ scanf("%d %d",&row,&cols); display(ch,rows,cols); printf("Enter another character and two integers: /n"); printf("Enter a newline to quit./n"); } printf("Bye./n"); return 0; } void display(char c,int lines,int width){ int row,col; for( row = 1; row <= lines, row++){ for( col = 1; col <= width; col++){ putchar(c); } putchar('/n'); } } 

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

 

 

你可能感兴趣的:(c,Google,语言,character,newline)