本文参考 C++ Primer Plus
getline 与 get 是面向行的输入函数。
重点:
getline():读取一行输入,直到换行符时读取结束,getline 会将换行符丢弃。
get():读取一行输入,直到换行符时读取结束,getl 不会将换行符丢弃。
getline() 函数原型: cin.getline(name, Character Length);
第一个参数name:存储输入行的数组名称;
第二个参数 Character Length:读取的字符数。
PS. get() 函数原型与 getline() 类似
getline() 读取停止条件:(1)读取指定数目的字符(2)遇到换行符
程序实例:
问题1:
cin.get(str1, size);
cin.get(str2, size);
由于第一次调用get后,换行符保留,第二次调用就会将换行符赋给str2,因此需要做处理,否则第二次读不到信息。
所以衍生出get() 另一种变体。
不带任何参数的get:
cin.get();//可以读取下一个字符,可以用它来处理 换行符
程序修改如下:
cin.get(str1, size);
cin.get();
cin.get(str2, size);
或者
cin.get(str1, size).get(); //即 cin.get(str1, size) + cin.get()
或者
cin.getline(str1,size).getline(str2,size);
存在的一些问题:
(1)读取空行
当getline 和 get 读取空行时,输入会被阻断,但可以用以下命令来恢复
cin.clear();
(2)输入的字符比分配空间长,则余下字符被留在输入队列中,而getline还会设置失效位,并关闭后面的输入。这个问题的解决后续再讲。
(3)混合输入数字和面向行的字符串,程序eg:
int main()
{
using namespace std;
cout << "what year was your house built?\n";
int year;
cin >> year;
cout << "what is the strees address?";
char address[80];
cin.getline(address, 80); //用户没机会输入地址,问题在于,cin 读取年份时,将 \n 留在输入队列中,
//而getline 看到换行符,认为空行,就将空行赋给 address
cout << "Year bulit: " << year << endl;
cout << "Address: " << address << endl;
cout << "Done!\n";
return 0;
}
解决办法:
cin >> year;
cin.get(); //获取空行
//or
(cin >> year).get();
程序修改如下:
int main()
{
using namespace std;
cout << "what year was your house built?\n";
int year;
(cin >> year).get();
cout << "what is the strees address?\n";
char address[80];
cin.getline(address, 80);
cout << "Year bulit: " << year << endl;
cout << "Address: " << address << endl;
cout << "Done!\n";
cin.get();
return 0;
}