1.scanf
scanf用于输入数据,它处理不了空格键和回车键(enter),两者其实都是字符,键盘上每一个键位都是一个字符,空格对对应'\0',回车对应'\n'。,scanf将处理不了的这两种键放入缓冲区。
缓冲区类似数据结构中的队列,一边只负责进,一边只负责出。顺序进出。
(1)当数据为单个字符时:
由于输入单个字符时,会按下一个字符键,再按下一个回车,而scanf处理不了回车键,将其放入缓冲区。所以当下一个scanf来读数据时不用输入直接读走回车键(\n),不用输入,这就造成了麻烦,代码如下:
char a, ch; int count = 0; while (1) { scanf("%c", &a); count++; printf("**************\n"); printf("%d\n", count); } //用count的值来反映scanf执行了多少次。
结果如下;
输入一个a和一个回车键程序执行两次,count的值变为2
2.当输入为字符串时,scanf遇到空格和回车键将其放入缓冲区代码如下:
char a[4] = "abc"; scanf("%s", a); for (int i = 0; i < 4; i++) { printf("%c ",a[i]); }
字符串"abc”其实是4个字符'a','b','c','\0'。'\0'是转义字符标志着字符串的结束,在屏幕上体现为占用一小段空间。
操作过程如下:
输入z, 输入空格,输入空格,按下回车。结果如下:
由于输入字符串,所以在输入z, 输入空格,输入空格,按下回车后,在%s的作用下会自动在结尾是添加转意字符'\0'形成字符串。由于空格和回车键全部放入缓冲区不处理,所以相当于只输入了一个字符z,结尾自动加上了转义字符'\0'。它俩就改变了字符串数组中ab的值。解释了结果z c。注意:中间的空格就是转义字符'\0'改变了b的值,z改变了a的值。
2.getchar
getchar作用是输入单个字符。它不处理回车键,处理空格,同样也是将回车键放入缓冲区。它的作用是与scanf作用在一起读取scanf留在缓冲区的回车键。防止影响下一次输入。
例如代码:
char a, ch; int count = 0; while (1) { scanf("%c", &a); getchar();//函数特点不需要传参 count++; printf("**************\n"); printf("%d\n", count); }
结果如下:
消除了缓冲区回车键的影响。
测试用例2:
输入a,b程序就自动停止了,没有机会输入c。a后面读取了一个回车键(\n)所以输出结果时换了行。
3.gets
只用于字符串的输入
gets
读取以任何字符开头的字符串,读取的字符串包括 空格
但是不包括 回车
,以 回车
结束输入,接收 空格
和 回车
,但之后会丢弃 回车
并以 \0
代替。
1. int main(){
2.char a[100];
3. gets(a);
4.printf("%d",strlen(a));
结果如下:
总结:
1.scanf 忽略行开头的所有空格,并以各种格式化进行数据输入,直到遇到 空格、回车 结束输入,不接收 空格 和 回车,留在缓存区中;
2.getchar 只读取一个字符,包括 空格 但是不包括 回车,回车 会留在缓冲区中;
3.gets 读取以任何字符开头的字符串,读取的字符串包括 空格 但是不包括 回车,以 回车 结束输入,接收 空格 和 回车,但之后会丢弃 回车 并以 \0 代替;