1、string类型变量的定义
在C++中提供了一个新的内建数据类型string,该数据类型可以替代C语言中char数组。需要使用string数据类型时则需要在程序中包含头文件string。string类型处理起来会比较方便,下面我们将逐一介绍该类型的功能。
例1:

在本例中介绍了几种定义string类型变量的方法,变量s1只是定义但是没有进行初始化,系统会将默认值赋给s1,默认值是“”(空字符串)。变量s2在定义的时候就被初始化为了"string",与C风格的char型数组不同,string类型的变量结尾是没有 ’\0’ 的,string类型的本质是一个string类,而我们定义的变量则是一个个的string类的对象。变量s3在定义的时候直接用s2进行初始化了,因此s3的内容也是"string"。变量s4初始化为10个‘s’字符组成的字符串,也即“ssssssssss”。(mine:字符用单引号,字符串用双引号)
从例1中我们也可以看出string类型变量可以直接通过赋值操作符“=”进行赋值。string类型变量可以用string类型变量或C风格字符串进行赋值。如s2则是用一个字符串常量进行初始化的,而s3变量则是通过s2变量进行初始化。
与C风格的字符数组不同,当我们需要知道字符串长度时,string类为我们提供了length函数。如下面例2所示,我们可以通过s变量来调用length函数,从而返回s变量的长度。因为string类型的变量末尾是没有 ’\0’ 字符的,因此其返回值就是变量的真实长度,而不是长度+1。
例2:

虽然C++提供了string类型来替代C语言中的字符数组形式的字符串,但是我们在程序设计过程中还是不可避免地会碰到需要用字符数组形式字符串的地方。为此,系统为我们提供了一个转换函数c_str,该函数将string类型的变量转换为一个const的字符串数组的指针。
例1:

在本例中我们为了打开文件的函数open,因此必须将string类型变量转换为字符串指针。
2、string类型变量的输入与输出
既然新增string类型变量,则不可避免的需要涉及到string类型变量的输入与输出操作。在C++中,在输入输出方面,我们可以像对待普通变量那样对待string类型变量,其输入输出仍然可以用输入输出操作符进行处理。
例1:

如本例所示,输入一个字符串,然后再将输入的字符串输出。运行程序结果如下:
string string↙
string
这个例子的运行结果输出只是一个string,而我们输入的是两个string,并且中间用空格隔开了。其实问题就出现在空格上,输入操作符是默认忽略空格的,当遇到空格时就开始存储字符串。因此后面一个输入的string没有被存储进去。
3、string类型字符串的连接
对于string类型变量,我们可以直接用“+”或者“+=”进行字符串的连接,操作符非常方便。用“+”风格字符串进行字符串连接时,操作符左右两边既可以都是string字符串,也可以是一个string字符串和一个C风格的字符串,还可以是一个string字符串和一个char字符。而用“+=”风格字符串进行字符串连接时,操作符右边既可以是一个string字符串,也可以是一个C风格字符串或一个char字符。
例1:

在本例中利用“+”和“+=”操作符分别尝试进行字符串连接,上面的所有连接都是符合语法规定的。string字符串连接非常灵活,大家可以多进行尝试。
4、修改字符串
string字符串同样可以先字符串数组那样按照下标逐一访问字符串中的每一个字符,string字符串的起始下标仍是从0开始。
例1:

在本例中我们定义了一个string类型变量s1,并给该变量赋值"1234567890",之后用for循环逐一输出每一个字符串中的字符。除了能够访问每一个字符外,修改它们同样也是允许的,例如在程序后面s1[5] = '5'语句将第6个字符修改为’5’,最后s1被修改为了"1234557890"。
除了能够逐个的去访问字符串中每一个字符外,系统还提供了一些函数方便我们操作string类型变量。
erase函数可以删除string类型变量中的一个子字符串。erase函数有两个参数,第一个参数是要删除的子字符串的起始下标,第二参数是要删除子字符串的长度,如果第二个参数不指名的话则是直接从第一个参数获取起始下标,然后一直删除至字符串结束。
例2:

当然,在使用erase函数时,在第一个参数没有越界的条件下,第二个参数可能会导致需要删除的子字符串越界,但实际上是不会的,函数会从以下两个值中取出一个最小值作为待删除子字符串的长度:
1)第二个参数的实参值;
2)字符串长度减去第一个参数的实参值。
其实说的简单一些,待删除字符串最多删除至字符串结尾。当然如果第一个参数直接越界了,那么函数执行会抛出异常的。
函数insert可以在string字符串中指定的位置插入另一个字符串,该函数同样有两个参数,第一个参数表示插入位置,第二参数表示要插入的字符串,第二个参数既可以是string变量,又可以是C风格的字符串。
例3:

insert函数的第一个参数同样有越界的可能,如果第一个参数越界,则函数会运行异常。
replace函数可以用一个指定的字符串来替换string类型变量中的一个子字符串,该函数有三个参数,第一个参数表示待替换的子字符串的其实下标,第二个参数表示待替换子字符串的长度,第三个参数表示要替换子字符串的字符串。第三个参数同样可以是string类型变量或C风格字符串。
例4:

同样的,该函数会有溢出的问题,如果第一个参数越界则会抛出异常。在第一个参数没有越界的前提下,第二个参数如果导致越界,则会选择以下两个值中的最小值作为待替换子字符串的长度:
1)第二个参数的实参值;
2)字符串长度减去第一个参数的实参值。
其实说白了,这个也就是说最多到字符串结尾的意思,这个与erase函数相同。
swap函数可以用于将两个string 类型变量的值互换,其使用方式见例5。
例5:

网友评论