cin型
- 平时最常用的,也是最基本的输入方式,就是"cin>>input"的形式,比如:
int i;
cin>>i;
或者像是这样:
string str;
cin>>str;
注意:使用cin时需要提前声明using namespace std,否则应写为诸如std::cin>>i的形式。
cin.get()型
- 当输入的内容中含有空格、回车或制表等的时候,此时cin不再使用,而采用cin.get()实现面向行的输入。具体如下:
char name[10];
cin.get(name,10);
注意:get并不会读取并丢弃换行符,而是将其留在输入队列里面,因此不能连续两次调用get(). 如下所示,此时第二次调用时看到的第一个字符便是换行符,因此cin.get()会认为已经到达行尾,而未发现可读取的内容,此时cin.get()将无法跨过换行符。
cin.get(name,10);
cin.get(str,20);
- 为解决上述问题,可使用不带任何参数的cin.get()调用可读取下一个字符(包括换行符)。因此可用“cin.get();”来处理换行符,为读取下一行做准备。如下:
cin.get(name,10);
cin.get();//read new line
cin.get(str,20);
另一种表现形式是使用get()将两个类成员函数拼接起来。
cin.get(name,10).get();
cin.get(str,20);
此外,还可以使用getline()直接实现两个类成员函数相连,而不必使用get():
cin.getline(name,10)。getline(str,20);
cin.getline()型
- getline()和get()函数都读取一行输入,直到到达换行符。随后getline()将丢弃换行符,而get()将换行符保留在输入序列里。
- getline()的标准格式为cin.getline(字符数组名,字符个数,结束标志)若未写结束标志则默认为'\0' 如下:
char str[20];
cin.getline(str,8,'e');
cout<<str;
若输入“abcdefghijk”,将输出“abcd”.
注意:cin.get()和cin.getline()用于数组而非字符串,需要将字符串用数组的形式表达。
- cin.getline()可以自由输入一行带空格和制表符的内容,这使得自由输入变得可能:
cin.getline(name,20);
这时输入hello world,输出的内容和输入的完全一致。而如果输出的字符数超过限制(如上述例子中的20),比如输入what is your favorite food,将会输出what is your favori,而不是输入的全部内容。值得注意的是,输出时最后一个字符必定是空字符(结束标志),它也会占据一个字符的位置,所以输出favori而非favorit。
输入字符串
string str;
cin>>str;
或者写为
string str;
getline(cin,str);//此时string对象会根据字符串长度自动调整自己的大小
这使得与使用数组的形式输入相比,使用string更加方便。因为我们可以把char数组视为一组用于存储一个字符串的单元。
混合输入字符串和数字
以《C++ Primer Plus》中的程序清单4.6为例:
#include<iostream>
using namespace std;
int main()
{cout<<"What year was your house built?\n";
int year;
cin>>year;
cout<<"What is its street address?\n";
char address[80];
cin.getline(address,80);
cout<<"Year built:"<<year<<endl;
cout<<"Address:"<<address<<endl;
cout<<"Done!\n";
return 0;
}
实际运行情况为:
What year was your house built?
1966
What is its street address?
Year built:1966
Address:
Done!
原因分析:当cin读取年份year时,换行符留在了year所在的输入队列中。之后cin.getline()识别到换行符时,会认为这是一个空行,这导致赋给address数组的是一个空字符串。
解决方法:在读取地址address前(读取year后)应该先读取并丢弃换行符。
- 方法1 单独使用cin.get()使得换行符被读取并丢弃
cin>>year;
cin.get();//or cin.get(ch);
- 方法2 将cin>>year与cin.get()拼接起来
(cin>>year).get();//or (cin>>year).get(ch);
修改以后最终输出为:
What year was your house built?
1966
What is its street address?
43821 Unsigned Short Street
Year built:1966
Address:43821 Unsigned Short Street
Done!