C的输入函数scanf比C++的输入含税cin快多了,所以在进行大规模数据录入的时候,一般是使用scanf
③cin.get(char)//接收一个字符,不扫描前导空白
关键字:
空白:包括space Tab Enter
扫描前导空白:即扫描缓冲区中的空格,并丢弃
C输入函数 scanf 、gets、 fgets 、getchar() scanf(只介绍格式控制符是 %c、%s的情况)
--%s读一个字符串 ,会扫描前导空白,遇到空白结束。
如果输入的字符串过长,超过字符数组的长度-1,那么运行的时候就会 瞪一声,然后结束运行。
char str[10];
scanf("%s",str);
cout<<str;
//输入 空格空格abcd ef
//输出 abcd
--%c读取一个字符,不会扫描前导空白。
所以如果缓冲区有遗留下来的空格,那就%c就可能不会读取到你所希望的字符。
char ch;
char str[10];
scanf("%s",str);
scanf("c",&ch);
//输入 abcd ef
//那么abcd被str所读取,空格被ch所读取
那怎么读取一个非空白字符呢?
--方法①
char str[2];
scanf("%1s",str);
char ch = str[0];
方法②
char ch;
scanf(" %c",&ch);//格式控制符%c前加空格,表示强制扫描前导空白,那么ch就能读取到非空白字符了
%s读取字符,遇到空白结束,那么如果我想读入的字符串包括space字符呢?该如何读入
--gets()读取字符串,不会扫描前导空白,遇到enter键结束,且丢弃enter键(即enter键不会遗留在缓冲区中)
gets同样存在与%s一样的问题,如果输入的字符串超过数组的长度-1,那么就会 瞪一声,然后运行结束
用fgets就不会出现这样的问题了
--fgets(char *str,size_t size,stdin) size = sizeof(str);
如果输入的字符串长度超过size-1就只会读取size-1个字符,如果不超过就正常读取
同样的,fgets也不会扫描前导空白
--getchar()
从缓冲区接收一个字符,通常用来清除缓冲区
要注意的是getchar()的返回值是int型而不是char型
C++输入函数 cin、cin.get()、cin.getline()
--cin不管是输入字符还是字符串,都会扫描前导空白。输入字符串时,遇到空格结束
char ch;
char str[10];
cin>>ch>>str;
cout<<ch<<" "<<str;
//输入
空格空格c空格abcd
//输出
c abcd
--cin.get()
//函数有重载
①
cin.get(char *name,int ArSzie)接收一个字符串,不扫描前导空白,遇到enter键结束,不会对enter进行处理
②cin.get(void)//接收一个字符,不扫描前导空白
③cin.get(char)//接收一个字符,不扫描前导空白
char ch;
char str[10];
cin.get(str,sizeof(str));
ch = cin.get();//与cin.get(ch);一样 因为上面没丢弃回车,所以回车被ch接收
cout<<(int)ch<<str;
//输入 空格abcd【enter】
//输出 空格abcd10
--cin.getline(char *str,size_t size)不扫描前导空白,遇到erter键结束,会丢弃enter键
char ch;
char str[10];
cin.get(str,sizeof(str));
cin.get(ch);
cout<<str<<ch;
//输入abcd【enter】e
//输出abcde//回车被cin.getline()所丢弃