在编程中,经常需要输入字符或者数字,而有时输出结果总是不尽人意。再此,对其做一个总结。
1.cin
(1)数字、字符
(2)字符串
int age;
char name[20];
cin >> age;
cout << age<<endl;
cin >> name;
// cin.getline(name,20);
cout << name <<endl;
当字符串输入为cin>>name时,输出为:
从输出结果可以看出,cin遇到回车则结束,实际上,cin遇到空格、回车、TAB均结束。
当字符串输入为cin.getline(name,20)时,输出为:
从输出我们发现,name没有输入的指示。这是因为cin在读取的过程中,遇到空格、回车、TAB结束的同时,还会把回车留在队列中,而cin.getline()遇到回车则结束。所以没有第二次输入。与此同时,也说明,cin会滤波队列中的回车、空格和TAB
为了清除队列中的空行,可以采用cin.get()来实现,具体见下一节。
2.cin.get()
(1)字符/空行
(2)字符串
cout << "请输入字符串:";
char a[20];
cin.get(a,5);
cout <<a<<endl;
cin.get(a,5);
cout <<a<< endl;
char ch;
ch = cin.get();
cout <<ch <<endl;
结果为:
由输出结果可以看出cin.get()可以接收空格,并且需要把最后一个字符存'\0';当输入流中有字符时,可以直接输出流中的数据。
当是当输入的字符长度较短时,输出的结果为:
输出的第二行和第三行均为空。这是因为输入的第五个字符为\n,cin.get()在读取到\n即停止,并且把\n存在队列中,即后两行读取的都是\n,所以输出为0。和上一节一样,需要把空行读出。空行的读取方法为
cin.get();
当在两个字符串中间加入读空行语句后,输出结果如下:
此时提示可以接着输入,输入第二行后,结果如下:
3.cin.getline()
读取字符串:
char a[20];
cout << "请输入字符串:";
cin.getline(a,5);
cout <<a<<endl;
cout << "请输入字符串:";
cin.getline(a,5);
cout <<a<< endl;
当输入字符长度小于4时(第5个用于存储'\0'),输出结果如下:
当输入的字符长度大于4个时,输入结果如下:
由输出结果可以看出,cin.getline()接收空格,但是第二行没有提示输入就直接结束。这是因为cin.getline()会把剩余的字符留在队列中,并且设置失效位,并关闭输入。为此,需要清楚失效位,其具体程序如下:
char a[20];
cout << "请输入字符串:";
cin.getline(a,5);
cout <<a<<endl;
if(!cin)
{
cin.clear();
while(cin.get() != '\n')
{
continue;
}
}
cout << "请输入字符串:";
cin.getline(a,5);
cout <<a<< endl;
上述通过判断cin的的失效位,对失效位进行清理,并且把输入流中的字符读出。其输出结果为:
当不需要清楚输入流中的字符时,只需要cin.clear()。则第二行输出为输入流中留下的字符。
4.getline()
字符串
string str;
getline(cin,str);
cout << str<<endl;
其输出为:由结果可以看出,getline可以读入空格,并且可以读任意长度的字符串。但是需要说明的是,getline在头文件string中,其要求对象为string类型。
5.getchar()
用于读入字符,为了便于分析其特点,程序如下:
char a[20];
char ch;
cout << "请输入字符串:";
cin.get(a,5);
cout <<a<<endl;
ch = getchar();
putchar(ch);
其输出结果如下: