面向行的输入:getline()
getline()函数读取整行,它使用通过回车键输入的换行符来确定输入结尾。要调用这种方法,可以使用cin.getline()。该函数有两个参数。第一个参数是用来存储输入行的数组的名称,第二个参数时要读取的字符数。如果这个参数为20,则函数最对读取19个字符,余下的空间用于存储自动在结尾处添加的空字符。getline()成员函数在读取指定数目的字符或遇到换行符时停止读取。
案例
#include <iostream>
int main() {
using namespace std;
const int Arsize = 20;
char name[Arsize];
char dessert[Arsize];
cout << "Enter your name: \n";
cin.getline(name, Arsize);
cout << "Enter your favorite dessert: \n";
cin.getline(dessert, Arsize);
cout << "I have some delicious " << dessert;
cout << "for you, " << name << ".\n";
}
输出
Enter your name:
Dirk Hammernose
Enter your favorite dessert:
Radish Torte
I have some delicious Radish Torte for you, Dirk Hammernose.
该程序可以读入完整的姓名以及用户喜欢的甜点。getline()函数每次读取一行。它通过换行符来确定行尾,但是不保存换行符。在存储字符串时,它用空字符来替换换行符。
面向行的输入:get()
istream类有另一个名为get()的成员函数,该函数有几种变体,其中一种变体的工作方式与getline()类似,它接受的参数相同,解释参数的方式也相同,并且都读取到行尾。但get并不再读取并丢弃换行符,而是将其留在输入队列中。假设我们连续调用两次get()。
cin.get(name, Arsize);
cin.get(dessert, Arsize);
由于第一次调用后,换行符将留在输入队列中,因此第二次调用时看到的第一个字符便是换行符。因此get()认为已经达到行尾,而没有发现任何可读取的内容。此时需要在两次调用get()的中间再调用一次不带参数的get()函数。
cin.get(name, Arsize);
cin.get();
cin.get(dessert, Arsize);
综合
#include <iostream>
#include <string>
using namespace std;
int main ()
{
cout << "What year was your house build?\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 build?
1966
What is its street address?
Year built: 1966
Address:
Done
从上面的输出可以看出,当我们输入 1966 时程序就自动往下执行并结束了,根本没有机会输入 street address。这是因为输入 1966,再按回车键时,回车键会留在缓冲区中,当执行 cin.getline(address, 80) 时首先会读入这个回车,getline()函数读入回车时,会认为一行输入结束了。
解决的办法是在 cin.getline(address, 80) 前面加一行 cin.get();