getline()和get()这两个函数都读取一行的输入,直到达到换行符。然而不同的是gerline()将丢弃换行符,而get()将换行符保留在输入序列中。
(1)getline
#include <iostream>
using namespace std;
const int SIZE = 15;
int main(){
char name[SIZE];
char dessert[SIZE];
cout << "Enter your name:";
cin.getline(name, SIZE);
cout << "Enter your favorite dessert:";
cin.getline(dessert, SIZE);
cout << " I have some delicious " << dessert;
cout << "for you," << name << ".\n";
return 0;
}
结果:
该程序可以读取完整的姓名以及用户喜欢的甜点,是因为getline()函数每次读取一行,它通过换行符来确定行尾,但不保存换行符。也就是他会抛弃有Enter键生成的换行符,并将换行符替换为空字符。
(2)get()
get()函数不再读取并丢弃换行符,二是将换行符保存到队列中,假设我们连续两次调用get()
cin.get(name,ArSize);
cin.get(dessert,ArSize);
由于第一次调用后,换行符将留在输入队列中,因此第二次调用时看到的第一个字符便是换行符,get()会认为已经到达行位,没有发现可读取的内容,如果没有其他帮助,将不能跨过该换行符。
#include <iostream>
using namespace std;
const int SIZE = 20;
int main(){
char name[SIZE];
char dessert[SIZE];
cout << "Enter your name:";
cin.get(name, SIZE);
cout << "Enter your favorite dessert: ";
cin.get(dessert, SIZE);
cout << "I have some delicious " << dessert;
cout << " for you," << name << ".\n";
return 0;
}
运行结果,第二个get()看到的第一个字符是第一个get()保存下来的换行符,所以第二个没有输入就直接进入下一行了。
解决这个问题的方法就是使用一个不带任何参数的cin.get()调用可读取下一个字符,因此通常用这种方法来处理换行符。
cin.get(name,ArSize);
cin.get();
cin.get(dessert,ArSize);
我们将上述程序改为
cout << "Enter your name:";
cin.get(name, SIZE).get();
cout << "Enter your favorite dessert: ";
cin.get(dessert, SIZE);
cout << "I have some delicious " << dessert;
cout << " for you," << name << ".\n";
程序运行结果为
可见,换行符被处理掉了。
关于更多的输入字符串和数字的问题,可以参考c++primer plus 第四章P81.