#include<stdio.h>
struct{
char name[32];
int age;
char sex;
}user;
int main(int argc, const char *argv[])
{
printf("enter user's name ,age,sex:\n");
scanf("%s%d%c",user.name,&user.age,&user.sex);
printf("%s\n%d\n%c\n",user.name,user.age,user.sex);
return 0;
}
我输入了 : zhangsan 12 w
意思为 名张三 12岁 是个女的(woman)
但是打印的是
zhangsan
12
pass anykey to continue...
为什么w没有打印出?这就是我们问题所在的关键>>>>>>>>缓存区。
什么是缓存区:为了解决高速设备和低速设备读写速率不吻合而建立的一块存储区域。(我自己的理解,如若有差错,还请指出,谢谢。)
比如我要看电影《战狼2》 我的电脑向网站服务器发送了请求,网站服务器回应请求给我发送视屏数据,假设没有缓存区,那么问题来了:
我看一部电影要1小时以上的时间才能看完,而服务器只需要几十秒就能将所有的数据发送给我,但是我看的很慢怎么办?服务器会这么解决:将电影一秒一秒地传输给我,而这个过程需要1小时以上,是十分浪费资源的事情,假若服务器将电影十几秒传输完毕,就可以做其他的事,这样效率就十分快捷了,于是乎便有了缓存区的概念,为了解决高速设备与低速设备之间读取速率不吻合而生成的东西。
cpu与内存之间有一个缓存区:cache,我们的cpu读写速度非常快,而内存则很慢,那么,我们的cpu要把数据传输给内存时,是先将数据送到缓存区,再由缓存区交给内存,这样解决了cpu的占用情况,使cpu的效率大大的提高。而在内存与我们的外部设备之间 ,也有一个缓存区,叫输入输出缓冲区,分别是stdin缓冲区和stdout缓冲区。
输入设备 -> stdin缓冲区-> 内存
内存 -> stdout缓冲区 ->输出设备
而我们的例子输入,zhangsan 12 w
将我们输入的东西存在了缓冲区,
其中 zhangsan (此处有个空格!)给了name数组,12给了age 而12之后的空格则给了我们的sex。
我们输入的scanf(“%s%d%c”,...) 中并没有申明输出样式 那么 按照字符控制符的特性,第一个%s不认识数字,到1之前就停止了,而%d不认识字符,在空格前停止,%c认识空格,就将空格接受,最后我们的w便被华丽的遗留下来。
也就是说在stdio.h中的scanf函数使用了缓冲区,正如我第一篇博客里写的进度条,就是利用了缓冲区的特点而写出来的。
具体的东西自己可以写一下感受。
在这里补充说明一下,我们的sex 是个char类型的变量,所以只需要得到一个字符,即读到空格就出去了,不在读w。