在c语言的学习中,永远少不了两个函数,那就是scanf 和 printf 函数。
scanf 其功能是按指定的格式从键盘读入数据,存入地址表指定存储单元中,并按回车键结束。
其格式为:scanf(“格式控制串”,地址表) scanf(“%d”,&num);
地址表:就是变量的地址,常用取地址运算符&。
scanf是一个行缓冲格式输入函数,当我们遇到这样的情况,
int num;
char ch;
printf("please input a number:\n");
scanf("%d",&num);
printf("please input a char:\n");
scanf("%c",&ch);
当我们打印运行这个程序时,当我们输入一个整型数字并按回车时,第二个scanf并不会让我们输入就会直接打印,因为scanf是一个行缓冲函数,当我们输入第一个时,在其缓冲区存下了数字num,以及'\n'这个字符,所以当程序执行到第二个scanf函数时就会直接将‘\n’应用,不会让用户从键盘输入,然后直接打印。
其实这个就是输入函数所留下的缓存垃圾,我们可以在两个scanf函数之间加上一个getchar()清除,或者用格式串中空格或%*c来“吃掉”。当然对于字符和字符串我们也可以用getchar和gets这样的输入函数。
printf 其功能就是按指定格式向显示器输出数据。
其格式为:printf("格式控制串”,输出表); printf("%d\n",num);
printf也是一个行缓冲函数,且与scanf共用一个缓存区。
int main()
{
printf("hello world!");
while(1)
return 0;
}
当我们运行这个程序时会陷入死循环,但是程序并不会打印hello world!,这是由于printf是一个行缓冲函数,先写到缓冲区,满足条件后,才将缓冲区刷到对应文件中。
(1)缓冲区填满
(2)写入的字符中有“\n”, "\r"
(3)调用fflush手动刷新缓冲区
(4)调用scanf要从缓冲区中读取数据时,也会将缓冲区的数据刷新
满足上面4个条件之一缓冲区就会刷新,也就是printf会真正调用write来写入。