缓冲区(Buffer)
缓冲区是在内存中预留的指定大小的存储空间,用来对输入/输出(I/O)的数据作临时存储。
空白符(white space)
一般,程序中所指的空白字符是指空格(space),回车(enter)和制表符(tab)。
scanf
作用:
从标准输入设备(通常是键盘)读取输入值,并存储到参数列表中指针所指向的内存单元。
处理机制:
以删除的方式从缓冲区读入数据:scanf从缓冲区读入一个数据项,该数据项在缓冲区中就被清除掉。如果scanf需要读取一个数据项,发现缓冲区当前是空的,那么程序就会在scanf代码处阻塞,等待用户输入,scanf函数接收到相应的数据项之后,在缓冲区中将这一数据项清除,scanf函数返回,程序继续执行。
整数%d
scanf默认的分割符是所有的空白字符。如果一个scanf函数中出现scanf("%d%d",&a,&b),那么用任何一个空白符来分隔两个整数a,b的值,变量a,b都可以接收到正确的输入,并且会忽略数据项的前导空白符。
字符串%s
忽略前导空白符,默认分隔符是所有空白符。C语言中,scanf会为字符数组末尾加上'\0',要注意边界。
字符%c
不会忽略前导空白符,默认没有任何分隔符,所有字符都会被当作输入字符。
当使用如while(~scanf("%c%c", &a, &b))形式时,两组a、b字符输入之间若以回车分隔,后面一组的a就会编程'\n'。处理方法是:
(1)清空缓冲区:两组读入之间使用 fflush(stdin);
(2)读取缓冲区数据: 两组读入之间使用
char c; while((c=getchar())!='\n'&&c!=EOF);
或者gets()函数 char c[10];gets(c);
char* gets(char* buffer)从stdin流中读取字符串,直至接受到换行符或EOF时停止,并将读取的结果存放在buffer指针所指向的字符数组中。换行符不作为读取串的内容,读取的换行符被转换为null值,并由此来结束字符串。读入成功,返回与参数buffer相同的指针;读入过程中遇到EOF(End-of-File)或发生错误,返回NULL指针。所以在遇到返回值为NULL的情况,要用ferror或feof函数检查是发生错误还是遇到EOF。
要注意的是gets函数可以无限读取,不会判断上限,所以应该确保buffer的空间足够大,以便在执行读操作时不发生溢出。如果溢出,多出来的字符将被写入到堆栈中,这就覆盖了堆栈原先的内容,破坏一个或多个不相关变量的值。
(3)在%c前加空格,屏蔽空白符影响。scanf(" %c", c);