我们编程写代码的时候有时会遇到这样一个问题:
编程如下:
#include <stdio.h>
int main()
{
int num;
char ch;
printf("please input the num(int):\n");
scanf("%d",&num);
printf("num = %d\n",num);
**********************************************
printf("please input the string:\n");
scanf("%c",&ch);
printf("ch = %c\n",ch);
return 0;
}
乍看一下,这只是一个很普通的运用scanf和printf的函数,函数输出结果由键盘键入num的值和ch的值;
然而真正运行的结果却不是这样,当我们再给num键入一个数值(本人运行的时候输入的是5)本来下一步是应该输出ch的值,但是接着之后的给字符串赋值的语句就直接跳过了,只输出ch = 没有结果。
那么是什么原因造成的呢?如果你将这两个复制输出语句分开在单独执行可以成功,很显然不是这个语句自身的错误;
造成这种情况出现的原因就是存在行缓冲现象;
scanf和printf函数共用同一个行缓冲区,用printf举例,printf是一个行缓冲函数,数据先写到缓冲区,只有满足条件以后才把缓冲区刷新到对应文件中;
该条件有如下几条:
1.缓冲区填满
2.写入的字符有'\n'和'\t‘
3.调用fflash手动刷新缓冲区
4.调用scanf函数从缓冲区读取数据时也会刷新
上面程序的现象就是由于当我们键盘输入一个数字(比如说5时),我们敲得键盘命令是5+空格(即为5 + \n),在缓冲区中5 \n 被存入,一直没有被刷出去,
所以当我们再给ch赋值时,缓冲区中已经有了字符\n,第二个scanf就直接取得了那个\n,也就不能再赋值了;
解决方法:
1,在两个调用函数之间添加getchar()函数,取走多余的\n;(程序中打****标记的那一行)
2.调用fflush函数;