关于scanf()这个函数一个重要的问题就在于他一次性就直接受一个输入值,例如:
#include <stido.h>
#include <iostream>
int main()
{
char a,ch;
scanf("%c”,&a);
scanf("%c”,&ch);
printf("hello world\n");
system(“pause");
return 0;
}
当输入这些代码的时候,原本是
w
R
hello world
但是实际的方针提示
w
hello world
这是因为scanf()这个函数只接受输入的第一个字符,当我们仿真的时候enter按键,也就相当于一个"\n"的字符,所以“\n"作为一个字符输入给了 ch 这个字符变量。
当我们一次性输入很多字母的时候,scanf()只接收第一个字符,其余的字符储备在了缓冲区,等到再次调用是scanf()函数时候,缓冲区储存区域的第一个字符就会自动的进入到此次调用的scnaf()函数,为了避免发生这种现象我们可以利用如下的方法:
#include <stdio.h>
#include<iostream>
int main()
{
char ch,a;
scanf("%c",&ch);
setbuf(stdin,NULL);
scanf("%c",&a);
printf("hello world);
system("pause");
return 0;
}
使用 setbuf(stdin,NULL);这个函数将输入缓冲区进行清空,这样字,scanf()输入完东西,缓冲区的数据都会被清除掉;
但是,这种方法有一个缺点就是,标准的C与C++里面从来没有定义锅这个函数,所以fflush(stdin)可能某些机子上运行不了。
补充,有时候我们输入的并不是正确的值,但是缓冲区回残留一些信息,下一个scanf可能直接读取上一个是残废()中剩余的值,这时候就会导致程序出故障,但是我们可以利用scanf()函数特性
特性:
scanf()的返回值就是他成功读取的值,比如
scanf("%c,%c",&a.&b)若a.b成功读取a.b的值那么scanf()函数的返回值就是2
还有一种方法:
while(scanf("%c,%c",&a.&b)!=2)
fflush(stdin);
c=a+b;
这样就能保证在输入错误的情况下,能够对缓存区的信息清空;
但是fflush(stdin)并不是标准C中所定义的函数,这个函数在gcc编译环境似乎不能使用,但是下面这种方法便具有普遍性了: