ISO/ANSI C++98标准通过添加string类扩展了C++库,可用string类型的变量(其实是对象)来代替字符数组存储字符串。
- string类使用起来比数组简单,它提供将字符串作为一种数据类型的表示方法。
- 要使用string类,必须在程序中包含头文件string。
- string类位于名称空间std中,必须用using编译指令或者std::string来应用它。
- string类定义隐藏了字符串的数组性质,使用户可以像处理普通变量一样处理字符串。
在很多方面,使用string对象的方式与使用字符串数组相同:
- 可以使用C-风格字符串来初始化string对象。C-风格字符串具体请参考:C-风格字符串[C++]。
- 可以使用cin来将键盘输入存储到string对象中。
- 可以使用cout来显示string对象。
- 可以使用数组表示方法来访问存储在string对象中的字符。
string对象和字符数组的主要区别:
- 可以将string对象声明为简单变量,而不是数组。
- 类设计让程序能够自动处理string的大小。
- 与使用数组相比,使用string对象更方便,更安全。
- 可以将char数组视为一组用于存储一个字符串的char存储单元,而string类变量则是一个表示字符串的实体。
- 不能将一个数组赋值给另一个数组,但可以将一个string对象赋值给另一个string对象。
1 string类字符串初始化、赋值和使用
C++1 1允许将列表初始化用于C-风格字符串和string类对象。
char firstData[] = {"xixihaha"};
char secondData[] {"xixihahahehe"};
string thirdData = {"ohhehehehe"};
string fourthData {"oheheiheihei"};
不能将一个数组赋值给另一个数组,但可以将一个string对象赋值给另一个string对象。
char char1[20];
char char2[20] = "hahahaha";
string str1;
string str2 = "hehehehe";
char1 = char2; //非法
str1 = str2;
可以使用运算符+将两个string对象合并起来。还可以使用运算符+=将字符串附加到string对象的末尾,相当于C-风格字符串的strcat(ch1, ch2)函数。
string str3;
str3 = str1 + str2;
str1 += str2;
也可以将C-风格字符串或string对象与string对象相加,或将它们附加到string对象的末尾。
处理string对象的语法通常比使用C字符串简单,比如:
str3 = str1 + str2;
//如果str1、str2、str3都是char数组,则需要以下步骤:
strcpy(str3, str1); //复制
strcat(str3, str2); //连接
使用字符数组处理时调用函数比较麻烦。
- 目标数组过小而无法存储指定信息时,会覆盖临近内存,可能导致程序终止或数据损坏,而string类能自动调整大小。
- 为了安全,C函数库提供与strcat()和strcpy()类似的函数strncat()和strncpy(),接受目标数组最大允许长度的第三个参数。
strlen()函数接受一个C风格字符串作为参数,并返回该字符串的字符数。string类函数的size()函数与此功能相同。
int len1 = str1.size(); //str1为string类对象
int len2 = strlen(cahr1); //char1为char数组
2 string类I/O
像C-风格字符串一样,string类对象可以使用cin和cout。
只是在面向行输入时,string类使用的句法不同。
调用格式一:getline(cin, str);
调用格式二:getline(cin, str, charEnd); //第三个为分界符,默认为换行符
- 和C风格字符串不同,这里的getline()不是类方法函数,它将cin作为参数。
- 该函数没有指出字符串长度,因为string对象根据字符串长度自动调整自己的大小。
- 之所以不同,是因为istream类比string类出现早,其中没有处理string类对象的行输入方法。
- cin和cout通用,在string中使用的是string对象的友元函数。