天天看点

C++: cin.get()与cin.getline()C++: cin.get()与cin.getline()

C++: cin.get()与cin.getline()

标签: C++ cin.get cin.getline

by 小威威

C++继承了C的字符串,定义于

<cstring>

的头文件中。在下文中,对C中字符串简称为Cstring,对C++中字符串简称为string。

字符串的输入有两种类型:一种是单词读取(也就是不包括空格),另一种是行读取(可以包含括号)。

对于单词读取,我们通常用istream中的cin;而对于行读取,Cstring我们通常用类方法getline(),get()。下面我讲着重讲述这两个类方法的区别以及注意的事项。

cin.getline()与cin.get()函数都可以读取整行的字符串,他们的区别是:

cin.getline() 能够读取回车键,并将之转化为换行符。这样就不会留一个回车键在输入流而对下一个字符串的输入造成影响。而cin.get()不能够读取回车键,而是将其继续留在输入流中,这样有个弊端就是回车键会对下一个回车键造成影响。

如:

char str1[20];
char str2[20];
cin.getline(str1, 20);
cin.getline(str2,20);
           

因为getline不会留下回车键在输入流中,因此将两个getline的类方法放在相邻行不会出现问题。而如果用两个get:

如:

char str1[];
char str2[];
cin.get(str1, );
cin.get(str2, );
           

这样就会导致str2无法输入,因为第一个get()遗留下的回车键被str2接收了。那么,该怎么解决呢?很简单,就在两个get函数之间加一个

cin.get()

或者直接在get函数后加:

如:

cin.get(str1,).get();
           

为什么能这样写呢?

因为类方法get返回的是cin对象,而get()函数是cin对象对应类的成员函数。为保险起见,我们可以在使用cin.get(name, lenth)的后面加上.get(),就像下面:

cin.get(str1, ).get();
cin.get(str2, ).get();
           

注意事项:

cin.getline()与cin.get()函数只能对Cstring操作,不能对string类型操作。因为在没有string类之前,

<iostream>

就已经存在了,它里面没有包含处理string类的成员函数。至于cin为什么能实现string类型的输入,书上说是string类的一个友元函数实现的(以后深入学习友元函数时再分析)。

那么,string类是否有类似的字符串行读取的函数呢?显然是有的。那就是getline(cin,name)函数。

这个getline函数与前文讲的getline函数不一样。上文讲到的getline函数是一个类方法,而这个getline不是。它的第一个参数是cin,表明了查找输入字符串的位置。

再附加一个知识点:用函数返回字符串大小。

在Cstring中,我们用strlen()函数测出长度。在string中,我们用size的类方法测出长度。但是有一个奇怪的地方:

char str1[20];
cout << strlen(str1) << endl;
           

输出的数字是不确定的,甚至大于我们定义的20。原因是:未初始化的字符串数组’\0’的位置是不确定的。strlen函数是从第一个字符开始扫描知道出现’\0’位置。因此输出的数字不确定。至于输出的数字大于20很有可能是字符串数组内没有’\0’,而是出现在字符串这段内存往后的位置。

以上内容皆为本人观点,欢迎大家提出批评和指导,我们一起探讨!