平常做程序的时候我们经常会遇到这样的情况,本来直接输入的是这样的数据,然
而在读取输出的时候却不是我们输入时的数据。这是为什么呢? 原因就是我们在输入
的时候留下了垃圾,而我们定义的某个变量接受的数据正是“垃圾”而不是我们想要
的数据。没事总结一下C、C++中清除垃圾的方法(花了我一上午的时间啊,不过感觉
很有必要):
C语言中缓冲区的刷新:(清除输入时的垃圾)
1.fflush(stdin)
头文件: include<stdio.h>
清空输入缓冲区,通常是为了确保不影响后面的数据读取(例如在读完一个字符串
后紧接着又要读取一个字符,此时应该先执行fflush(stdin);)。
**st是标准的意思,in指的是输入
fflush(stdin)是C中的一个函数,用来刷新缓冲区,如果刷新成功返回的是 0,指
定的流没有缓冲区或者只读打开时也返回0值。返回EOF指出一个错误。
例:
#include<stdio.h>
int mian()
{
int i;
char ch;
scanf("%d",&i);
fflush(stdin);
scanf("%c",&ch);
printf("i=%d,ch=%d\n",i,ch);
return 0;
}
输入: 23 输出:23
a a
如果不加 fflush(stdin); 则输出的是 23 32 ,因为没有fflush(stdin)时第二个ch
接受的是 回车而不是 a;
2.getchar();
头文件: #include<stdio.h>
它的作用是单个的读取缓冲区里的数据,只能单个的读取; 用户输入的数据先存
放在缓冲区里,然后当执行getchar()时读取缓冲区里的相对第一个字符。如果出错
返回 -1。
利用它只能单个读取字符的特性可以用它来清除部分输入时留下的垃圾。
例:
#include<stdio.h>
int mian()
{
int i;
char ch;
scanf("%d",&i);
getchar();//如果没有getchar();则ch接受的数据将会是输入时留下的垃圾
//空格或者是回车;在这里相当必要!!!
scanf("%c",&ch);
printf("i=%d,ch=%d\n",i,ch);
return 0;
}
3. %*nc
n的值是可以根据而要而改变的,表示的是 吸收的字符的个数。用法和 getchar()
相像,只不过它可以很方便的改变吸收的字符的个数。
例:
#include<stdio.h>
int mian()
{
int i;
char ch;
scanf("%d",&i);
scanf("%*%c",&ch);// 如果没有 %*c 输出的ch是“垃圾”,加上后就正确了
printf("i=%d,ch=%d\n",i,ch);
return 0;
}
C++ 中刷新缓冲区的方法
1,ignore()
调用的形式: cin.ignore(n,ch); 其中 n 指的是忽略字符的个数,ch 代表的是
终止的字符。 默认的情况下以 EOF结束。。。
利用它忽略字符的特性可以作为“清除输入垃圾”的方法,但要明确它并不是真正
的清除。。。
例:
2.cin.sync()
用来清除缓冲区中未读取的信息
例:
输入: jkifi
fsjofia
输出: a: j b: f 不加这个函数第二个输出的是 b: k
利用这个函数可以避免在一些地方输入出错问题!
3.cin.clear()
这个只知道是用来重置错误标志的,具体的用法和功能还不是很清楚,弄清楚了再说
吧!
以下为本人添加:
从键盘读入5个整数值,若出现非法字符,则提示用户输入数字: