取了,然后再读第三条语句就没有影响了。
还有一种方式就是使用get()的方式将两个类成员函数拼接起来(合并),如下所示:
cin,get(name, ArSize).get();
同样,getline()也可以这么用:
cin.getline(name1,ArSize).getline(name2,ArSize);
还是上面的例子,可以这么表达:
从上面几个例子的对比我们可以总结一下,输入一行完整的字符串的方法有这么几种:使用cin.getline(name,20)或者使用cin.get(name,20).get()。那么我们应该选择使用哪一种呢
当然,都可以,但是使用get()输入更仔细。例如,假如使用get()将一行读入数组中,如何知道停止读取的原因是由于已经读取了整行,而不是由于数组已经填满了呢查看下一个字符,如果是换行符,说明已读取了整行,否则,说明该行中还有其他输入。总之,getline()使用起来更简单一些,但get()使得检查错误更简单些。
④混合输入字符串和数字
混合输入数字和面向行的字符串会导致跟上面同样的问题。
用户根本没有输入地址的机会,问题在于当cin读取年份之后,将回车键留在了输入队列中,后面的getline()看到换行符认为是一个空行,并将这个空字符串给了address数组。解决的方法也就是上面介绍的几种:
cin>>year;
cin.get();
或者(cin>>year).get(); 或者 (cin>>year).get(ch);
C++程序常使用指针(而不是数组)来处理字符串,以后会讲到。
(2)string类简介
ISO/ANSI C++98标准通过添加string类扩展了C++库,因此现在可以用string类型的变量而不是字符串数组来存储字符串。string类使用起来比数组简单,同时提供了将字符串作为一种数据类型的表示方法。
要使用string类,必须在程序中包含头文件string。string类位于名称空间std中,因此需要使用using namespace std;指令。string类定义隐藏了字符串的数组性质,使得处理字符串像处理普通变量那样简单。
看下面的例子:
下面是运行结果:
从上面这个例子中可以看到,string对象和使用字符数组有很多相同之处:
可以使用C风格字符串来初始化string对象;
可以使用cin来将键盘输入存储到string对象;
可以使用cout来显示string对象;
可以使用数组表示法来访问存储在string对象中的字符(即可以将string对象看作一个数组,可以访问其中的某一个元素)。
字符串数组和string对象的主要区别是:可以将string对象声明为简单变量,而不是数组:
string str1; string str2 = "panther";
类设计让程序能够自动处理string的大小。例如,str1的声明创建一个长度为0的string对象,但是将输入读取到str1中时,将自动调整str1的长度;这使得与数组相比string对象更方便,也更安全。
①赋值、拼接和附加
string类的操作比使用数组时更简单。例如,不能将一个数组赋给另一个数组,但可以将一个string对象赋给另一个string对象。例如: string str1; string str2 ="pantner"; str1 = str2;
string类简化了字符串的合并操作。可以使用运算符+将两个string对象合并起来,还可以使用运算符+=将字符串附加到string对象末尾。如 string str3; str3 = str1+str2; str1+=str2;
处理string对象的语法通常比使用C字符串函数简单,尤其是执行较为复杂的操作时。例如:
str3 = str1 + str2;
使用C-风格字符串时,需要使用的函数如下:strcpy(charr3,charr1); strcat(charr3, charr2);
另外,使用字符数组时总是存在目标数组过小而无法存储指定信息的危险,如下例:char site[10] = "house";
strcat(site, " of pancakes"); 函数strcat()试图将全部12个字符复制到数组site中,这将覆盖相邻的内存。这可能道枝程序终止或程序数据被破坏。而string类具有自动调整大小的功能,从而避免这种问题的发生。
确定字符串字数的方法也有区别:int len = str1.size(); int len2 = strlen(charr1);
②string类的I/O
可以使用cin或cout来输入存储到string对象或输出,其句法与处理C-风格字符串相同。但是每次读取一行而不是一个单词。