//只读取一个单词
//示例一:instr1.cpp--reading more than one string
#include <iostream>
int main()
{
using namespace std;
const int ArSize = 20;
char name[ArSize] = "";
char dessert[ArSize] = "";
cout << "Enter your name: \n";
cin >> name;
cout << "Enter your favorite dessert: \n";
cin >> dessert;
cout << "I have some delicious " << dessert;
cout << "for you, " << name << ".\n";
return 0;
}
下面是该程序的运行情况:
Enter you name:
Alistair Dreeb
Enter your favorite dessert:
I have some delicious Dreeb for you, Alistair.
我们甚至还没有对“输入甜点的提示”做出反应,程序便把它显示出来了,然后立即显示最后一行。这是为什么呢?由于不能通过键盘输入空字符,因此cin需要用别的方法来确定字符串的结尾位置。cin使用空白来定字符串的界。这意味着cin在获取字符串数组输入时只读取一个单词。读取该单词后,cin将该字符串放到数组中,并自动在结尾添加空字符。
这个例子的实际结果是:cin把Alistair作为第一个字符串,并将它放到name数组中,再把Dreeb留在输入队列中,当cin在输入队列中搜索用户喜欢的甜点时,他发现了Dreeb,因此cin读取Dreeb,并将它放到了dessert数组中。
//每次读取一行字符串输入
istream中的类提供了一些面向行的类成员函数:getline()和get()。这两个函数都读取一行输入,直到到达换行符。然而,随后getline()将丢弃换行符,而get()将换行符保留在输入序列中。
1.面向行的输入:getline()
getline()函数读取整行,它使用通过回车键输入的换行符来确定输入结尾。要调用这种方法,可以使用cin.getline()。该函数有两个参数,第一个参数用来存储输入行的数组的名称,第二个参数是要读取的字符数,如果这个参数为20,则函数最多读取19个字符,余下的空间用于存储自动在结尾处添加的空字符。getline()成员函数在读取指定数目的字符或遇到换行符时停止读取。
例如,假设要使用getline()将姓名读入到一个包含20个元素的name数组中,可以这样使用函数调用:
cin.getline(name,20);
2.面向行的输入:get()
由于get()并不再读取并丢弃换行符,而是将其留在输入队列中,假设我们连续两次调用get():
cin.get(name,ArSize);
cin.get(dessert,ArSize);
由于第一次调用后,换行符将留在输入队列中,因此第二次调用时看到的第一个字符便是换行符,因此get()认为已经到达了行尾,而没有发现任何可读取的内容。幸运的是,get()有另一种变体,使用不带任何参数的cin.get()调用可读取下一个字符(即使是换行符),因此,可以用它来处理换行符,为读取下一行输入做准备,也就是说,可以采用下面的调用顺序:
cin.get(name,ArSize);
cin.get();
cin.get(dessert,Arsize);