getline():
getline()函数读取整行,它使用通过回车键输入的换行符来确定输入结尾。调用方法为cin.getline()。该函数有两个参数。第一个参数是数组名,第二个参数是要读取的字符数。例如第二个参数为n,则函数最多读取n-1个字符,因为至少要保留一个空间存空字符,即'\0'。getline()成员函数在读取指定数目的字符或遇到换行符时停止读取。当遇到换行符时,它也会从输入流中读取该换行符,但在存储字符串时,用空字符代替换行符来存储在字符串中。
get():
该函数有几种变体,其中一种变体的工作方式与getline()类似,接受的参数的意义与解释都相同,并且都是读取到行尾。但是当遇到换行符时,get()方法并不读取换行符,而是将其留在输入流中。例如当执行以下语句时:
cin.get(a,100);
cin.get(b,100);
由于在输入b的时候,输入流中第一个字符是在输入a时留下来的换行符,因此实际上输入给b的字符是一个换行符。为了避免这个问题,可以在其中添加一条一句,即:
cin.get(a,100);
cin.get();
cin.get(b,100);
cin.get()会“吸收掉”输入流中留下来的换行符。也可以这么简写:
cin.get(a,100).get();
cin.get(b,100);
之所以可以这么做,是因为cin.get(a,100)返回的是一个cin对象,该对象随后将被用来调用get()方法。同样道理,下列语句也是允许的。
cin.getline(a,100).getline(b,100);
关于string使用getline()
C++添加了string类扩展了C++库。因此可以用string类型的变量而不是字符数组来存储字符串。要使用string类,必须包含头文件string。
一般字符数组和string变量使用getline()方法是不同的。
char a[100];
string str;
cin.getline(a,100);
getline(cin,str);
cin.getline()这种是句点表示法,函数getline()是istream类的一个类方法。getline(cin,str)没有用到句点表示法,这表明这个getline()不是类方法。它将cin作为参数,指出到哪里去查找输入。另外,也没有指出字符串的长度,因为string对象会根据输入的串的大小自动调整自身的大小。
为什么第二个getline()不是istream的类方法呢。在引入string类之前很久,C++就有了istream类。因此istream的设计考虑到了诸如double和int等基本C++数据类型,但没有考虑到string类型,所以string类中,有处理double,int和其他基本类型的类方法,但没有处理string对象的类方法。
但cin方法也适用与string类对象,这涉及到友元函数,这里先不阐述。