cin<<,
很多初学者都认为cin函数是一个很简单的函数,其实不然!cin函数有很多需要了解的知识(比如:cin的返回值是什么,cin提供了哪些成员函数且分
程序1:
#include
using
int
{
}
测试情况:
如果用户每次都输入两个合法的数,程序不会出问题!
但是如果用户第一次输入时给一个非法的输入,比如说输入一个字符'a',你会发现程序不
会再执行第二条输入语句。似乎有点奇怪!!
(当输入与变量类型不同时,cin不会执行下去。)
程序2:
#include
using
int
{
}
程序的功能很简单,就是输入一个字符串再输出,再次输入一个字符串输出。程序执行情况:
测试一:
abcd
abcd
efgh
efgh
当用户第一次输入的字符串字符数小于4时,程序执行正常!
测试二:
abcdefgh
abcd
当用户第一次输入的字符数字符数大于4时,第一个字符串接受输入的前四个字符,而第二次的输入操作没有执行,第二个字符串输出为空。似乎也很奇怪!!!
其实在很多时候都会遇到诸如此类的问题,如果不熟悉程序输入的原理和cin等一些函数的原理就不知道怎么解决!我在这里做一个简单的介绍,也许介绍得不是很准确和全面,或者存在一些误解,请大家包涵!
输入操作的原理与前一节中提到的scanf函数一样,程序的输入都建有一个缓冲区,即输入缓冲区。一次输入过程是这样的,当一次键盘输入结束时会将输入的
cin的一些输入函数和操作符cin
一.
该操作符是根据后面变量的类型读取数据。
输入结束条件
对结束符的处理
读字符的情况:
程序3:
#include
using
int
{
}
测试一输入:
a
b
输出:
a
测试二输入:
a
输出:
a
读字符串的情况:
程序4:
#include
using
int
{
}
测试一输入:
abcd
efgh
输出:
abcd
efgh
【分析】输入遇到回车符结束,很正常。
测试二输入:
abcd
输出:
abcd
efgh
【分析】第一次读取字符串时遇到空格则停止了,将abcd读入str1,并舍弃了空格,将后面的字符串给了第二个字符串。这证明了cin读入数据遇到空格结束;并且丢弃空格符;缓冲区有残留数据室,读入操作直接从缓冲区中取数据。
二.cin.get()
该函数有三种格式:无参,一参数,二参数
即cin.get(),
读取字符的情况:
输入结束条件:Enter键
对结束符处理:不丢弃缓冲区中的Enter
cin.get()
即:ch=cin.get()
程序5:
#include
using
int
{
}
测试一输入:
a
输出:
a
97
【分析】会发现只执行了一次从键盘输入,显然第一个字符变量取的'a',
测试二输入:
a
输出:
a
97
【分析】显然第一个字符变量取的'a',
读取字符串的情况:
cin.get(array_name,
程序6:
#include
using
int
{
char
cin.get(a,
cout<<a<<endl;
return
}
测试一输入:
abc
输出:
abc
【分析】说明该函数输入字符串时可以接受空格。
测试二输入:
1234567890
输出:
123456789
【分析】输入超长,则按需要的长度取数据。
程序7:
#include
using
int
{
char
cin.get(a,
cin>>ch;
cout<<a<<endl;
cout<<(int)ch<<endl;
return
}
测试一输入:
12345
输出:
1234
53
【分析】第一次输入超长,字符串按长度取了"1234",而'5'仍残留在缓冲区中,所以第二次输入字符没有从键盘读入,而是直接取了'5',所以打印的ASCII值是53('5'的ASCII值)。
测试二输入:
1234
a
输出:
1234
97
【分析】第二次输入有效,说明该函数把第一次输入后的Enter丢弃了!
三.cin.getline()
cin.getline()
但是这两个函数是有区别的:
cin.get(array_name,
程序8:
#include
using
int
{
char
cin.getline(a,
cin>>ch;
cout<<a<<endl;
cout<<(int)ch<<endl;
return
}
测试输入:
12345
输出:
1234
-52
【分析】与cin.get(array_name,
问题描述一:(分析scanf()和getchar()读取字符)
----------------------------------------------------
程序1:
char
scanf("%c",
scanf("%c",
printf("%d
return
char
ch1
ch2
printf("%d
return
【分析】:
----------------------------------------------------
|
----------------------------------------------------
首先我们看一下scanf()读取字符串的问题:
程序2:
char
scanf("%s",str1);
printf("%s\n",str1);
scanf("%s",str2);
printf("%s\n",str2);
return
测试一输入:
Hello
输出:
Hello
world!
【分析】到此程序执行完毕,不会执行第二次的读取操作!这个问题的原因跟问题一类似,第一次输入Hello
测试二:
Hello
Hello[输出]
world
world[输出]
【分析】程序执行了两次从键盘读入字符串,说明第一次输入结束时的回车符被丢弃!即:scanf()读取字符串会舍弃最后的回车符!
我们再看一下gets()读取字符串的情况:
用scanf来读取一个字符串时,字符串中是不可以出现空格的,一旦出现空格,后面的数据就会舍弃残留在缓冲区中。其实有另外一个函数是可以接受空格的,那就是gets(),下面我们看一下这个函数的应用,我们把程序2改动一下:
程序3:
#include
int
{
char
gets(str1);
printf("%s\n",str1);
gets(str2);
printf("%s\n",str2);
return
}
测试:
Hello
Hello
12345
12345
【分析】显然与上一个程序的执行情况不同,这次程序执行了两次从键盘的读入,而且第一个字符串取了Hello
--------------------------------------------------------
|
--------------------------------------------------------
【分析】原因跟上面例子讲的一样,是因为输入缓冲区中还有数据,所以getchar()会成果读到数据,所以就跳出了!
------------------
|
------------------
第一:要注意不同的函数是否接受空格符、是否舍弃最后的回车符的问题!
读取字符时:
scanf()以Space、Enter、Tab结束一次输入,不会舍弃最后的回车符(即回车符会残留在缓冲区中);
getchar()以Enter结束输入,也不会舍弃最后的回车符;
读取字符串时:
scanf()以Space、Enter、Tab结束一次输入
gets()以Enter结束输入(空格不结束),接受空格,会舍弃最后的回车符!
第二:为了避免出现上述问题,必须要清空缓冲区的残留数据,可以用以下的方法解决:
方法1:C语言里提供了函数清空缓冲区,只要在读数据之前先清空缓冲区就没问题了!
方法2:自己取出缓冲区里的残留数据。
(说实话这个语句我也没看懂,呵呵!为什么格式控制是这样的!希望高手指点一下!)
cin,_cin.get,cin.getline等函数深…
最新推荐文章于 2023-10-30 19:39:45 发布
