(三)string类简介
1.string类的优势:
使用string类的时候,必须在头文件中包含string,即#include <string>。有时候,如果文件中包含了iostream类的话,iostream类本身就包含了头文件string类(iostream类的声明中有#include <string>),因此可以省略string类的编译预处理指令,但是为了阅读方便和程序清晰的话,建议加上#include <string>。
string类可以定义一个字符串,方便了字符串的处理,可以用简单的符号来进行字符串的赋值(=),拼接(+)和附加(+=)的操作。string类的最大的优势是可以自动调整字符串的长度,不会有超过存储容量的危险。
处理c++string对象的的语法相比处理C语言字符数组的函数更简单和直观,尤其是处理较为复杂的情况更是如此,而且使用的时候不用担心string对象的长度问题,因为这是程序自动处理的,这些特点简化了编程的复杂性和易错性。
2.string类的操作
(1)基本操作:
不能将一个数组赋给另一个数组,但可以将一个string对象赋给另一个string对象(赋值);可以使用运算符+将两个string对象合并起来(拼接);还可以使用运算符+=将字符串或另一个string对象附加到 string 对象的末尾(附加)。对比c语言中对字符串数组的操作,需要使用cstring头文件(strlen函数需要包含此头文件)中的相应的字符串操作函数。可以使用函数strcpy()将字符串复制到字符数组中,比如strcpy(str1,str2);就可以将str2的内容复制到str1中。使用函数strcat()将字符串附加到字符数组末尾,比如strcat(str1,str2);将str2的内容附加到str1的后面。
要获得字符串的长度,可以使用string对象的类方法:字符串对象名.size();来获得;而字符数组需要使用cstring库的函数strlen来确定字符串的长度,strlen(c风格字符串);strlen()接受一个c风格字符串来作为参数,返回字符串长度。
(2)string类的输入输出
#include <string> //可以用string类来管理字符串
#include <cstring> //包含这个类可以用strlen,strcpy,strcat,strcom等函数
#include <iostream> //输入输出类
未被初始化的string对象的初始长度为零。
istream的设计考虑到了诸如 double 和int等基本C++数据类型,但没有考虑 string 类型,所以 istream 类中,有处理 double、 int 和其他基本类型的类方法, 但没有处理 string 对象的类方法。正因为如此,我们使用cin来整行输入string对象的时候,不能使用cin.getline();(因为没有嘛),只能用getline(cin,string &)的形式,比如string str;getline(cin,str);将键盘输入的一行储存到str对象中。对于字符数组,getline的使用方式为:cin.getline(str,30);前面是str是字符数组名,后面的30是字符数组的长度(最后的结尾字符也计算在内),最多可以存放29个字符。
但是我们依然可以使用cin >> str;来输入字符赋值给string对象str,这里涉及到友元函数的用法。
(3)其他字符串类型的数据
其他类型:除char类型外,C++还有类型 wchar_t:而 C++ll 新增了类型 ch16_t 和 char32_t。 可创建这些类型的数组和这些类型的字符串字面值。对于这些类型的字符串字面值,C++分别使用前缀 L、 u和U表示,下面是一个如何使用这些前缀的例子:
wchar_t title[] = L”Chief Astrogator”; //w_char string
char16_t name[] = u” Felonia Ripova”; // char_16 string
char32_t car[] = U”Humber Super Snipe ”; //char_32 string
除此之外,c++11还支持UTF-8,这种编码根据字符的不同,将字符存储为1-4个字节,因此,汉字和英文字符等可以混用,并且都可以存放到char数组中,方便了使用。
3.原始字符串:
为了能更容易地输入一些特殊的字符,比如回车,c++11新增了一种叫做原始字符串的东西,原始字符串将”( 和 )”用作定界符,并使用前缀R来标识原始字符串:
cout << R”(Jim ” King” Tutt uses ”\n” instead of endl.)”,加粗部分将会按原来的样式输出,括号里面的内容将不会转义。原始字符串中,按回车会在字符串里添加回车字符,而不是普通意义上的空白。原始字符串的定界符”(是可以自定义的,自定义定界符时,在默认定界符之间添加任意数量的基本字符(一般用几个字母或数字就可以了),那么就会造出新的定界符。比如cout<< R”+*(”(Who wouldn't?) ”, she whispered .)+*”<<endl;其中"+*(就是我们新造的定界符,加粗的部分就是原始字符串,我们可以在里面随意输入字符,这些字符都会按原样输出。
注意一点的是:可将前缀R与其他字符串前缀结合使用,以标识wchar_t等类型的原始字符串。可将R放在前面,也可将其放在后面,如Ru表示char16_t类型的原始字符串, UR表示char32_t类型的原始字符串等。