改用 fflush(stdin)更佳。
ret = scanf("%d,%d",&a,&b) ret 为成功读得的数据个数。
清除的缓冲区中的残留数据: if (ret != 2) fflush(stdin)
是I/O 函数分为“带缓冲”的和“不带缓冲”的两类。
带缓冲的 I/O 函数写数据时,并不直接写磁盘介质,而是将数据先写到这块内存缓冲中,之后用户空间缓冲中的数据会被传送到系统缓冲中。
linux 内核会将系统缓冲中的数据送完磁盘驱动器(fsync函数可以加速这一过程),这之后,数据才真正的被写入磁盘。
因为目前内存的读写速度往往远大于硬盘的读写速度(常 ms 级)。因此,缓冲区的建立可以尽力避免太过频繁的写磁盘。
对于硬盘来说,写入一个字节可能跟写入一个扇区没什么两样,程序员每次写入的数据也许就几个字节,所以可以将每次写入的几个字节放入缓冲区,排列组合成一整块数据再写入,也能极大的提升效率。
扩展资料
1、带缓冲的 I/O 读函数读取数据之前,则会首先判断用户空间的进程缓冲区是否包含数据,如果没有,则继续判断系统缓冲区是否包含数据。
2、“带缓冲”的 I/O 读函数从磁盘读取数据时,并不只读取调用者指定的读取字节数。读函数可能一次性读取一个扇区(常常是 512B)保存在缓冲区里,只返回给程序员需要的 10 字节。
scanf("%*[^\n]")^取反或者“非”,[^\n]就是除了回车什么都可以被scanf读到。*表示被读到了但是不把读到值或者字符赋值给任何变量。
%*[^\n]就是读取来自键盘的出去回车外的任意字符,并不赋值给变量。
scanf("%*c")
就一个*,和上边表示一样就是读到了不赋值给任何变量。
再看,scanf("%[^\n]%*c",str)读入一行字符,赋值给str变量。如果c前面没有*,那么就需要str后面再写一个char类型的ch。这就告诉*表示读到了但是不赋值给任何变量。
那么scanf("%*[^\n]%*c")这句话,应该能理解了,两个格式控制符里面都有*,就是都读到了都不赋值变量。
读到这里应该差不多理解了,就是题中的两句scanf(相当于scanf("%*[^\n]%*c"))读到了输入的abc,但是没有赋值给任何变量。然后到了gets(str4)读到了def赋值给str4,然后printf("%s\n", str4)后必然显示def。
清空缓存区用fflush(stdin)这句代码。
键盘输入的东西都是放在缓冲区的这款区域,有变量过来了就带走,没有变量就在那里呆着等待一个变量来带它走。但是这个时候缓冲区里面偶尔会有一些垃圾的字符,而影响了正常的输入,有的时候用getchar()带走一个两个的字符,但是如果还是不见效一句fflush(stdin)就可以了。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)