C++修改字符串

和字符串数组(char *)类似,string 字符串也可以按照下标逐一访问每一个字符,string 字符串的起始下标仍是从 0 开始。

【例 1】
#include <iostream>
#include <string>

using namespace std;

int main()
{
    string s1 ;
    s1 = "1234567890";
    for(int i=0; i<s1.length(); i++)
        cout<<s1[i]<<" ";
    cout<<endl;
    s1[5] = '5';
    cout<<s1<<endl;
    return 0;
}
在本例中,我们定义了一个 string 类型变量 s1,并给该变量赋值 "1234567890",之后用 for 循环逐一输出每一个字符串中的字符。除了能够访问每一个字符外,修改它们同样也是允许的,例如在程序后面s1[5] = '5';语句将第 6 个字符修改为 '5',最后 s1 被修改为了 "1234557890"。

除了能够逐个的去访问字符串中每一个字符外,系统还提供了一些函数方便我们操作 string 类型变量。

string erase()函数

erase() 函数可以删除 string 类型变量中的一个子字符串。

erase() 函数有两个参数,第一个参数是要删除的子字符串的起始下标,第二参数是要删除子字符串的长度,如果第二个参数不指名的话,则是直接从第一个参数获取起始下标,然后一直删除至字符串结束。

【例 2】
#include <iostream>
#include <string>

using namespace std;

int main()
{
    string s1, s2, s3;
    s1 = s2 = s3 = "1234567890";
    s2.erase(5);
    s3.erase(5, 3);
    cout<< s1 <<endl;
    cout<< s2 <<endl;
    cout<< s3 <<endl;
    return 0;
}
程序最终运行结果:

1234567890
12345
1234590

使用 erase() 函数时,在第一个参数没有越界的条件下,第二个参数可能会导致需要删除的子字符串越界。但实际上是不会的,函数会从以下两个值中取出一个最小值作为待删除子字符串的长度:
  • 第二个参数的实参值;
  • 字符串长度减去第一个参数的实参值。

说的简单一些,待删除字符串最多删除至字符串结尾。当然如果第一个参数直接越界了,那么函数执行会抛出异常的。

string insert()函数

insert() 函数可以在 string 字符串中指定的位置插入另一个字符串。

insert() 函数同样有两个参数,第一个参数表示插入位置,第二参数表示要插入的字符串,第二个参数既可以是 string 变量,又可以是 C 风格的字符串。

【例 3】
#include <iostream>
#include <string>

using namespace std;

int main()
{
    string s1, s2, s3;
    s1 = s2 = "1234567890";
    s3 = "aaa";
    s1.insert(5, s3);
    cout<< s1 <<endl;
    s2.insert(5, "aaa");
    cout<< s2 <<endl;
    return 0;
}
本例最终运行结果:

12345aaa567890
12345aaa567890

insert() 函数的第一个参数同样有越界的可能,如果第一个参数越界,则函数会运行异常。

string replace()函数

replace() 函数可以用一个指定的字符串来替换 string 类型变量中的一个子字符串。

replace() 函数有三个参数,第一个参数表示待替换的子字符串的其实下标,第二个参数表示待替换子字符串的长度,第三个参数表示要替换子字符串的字符串。第三个参数同样可以是 string 类型变量或 C 风格字符串。

【例 4】
#include <iostream>
#include <string>

using namespace std;

int main()
{
    string s1, s2, s3;
    s1 = s2 = "1234567890";
    s3 = "aaa";
    s1.replace(5, 4, s3);
    cout<< s1 <<endl;
    s2.replace(5, 4, "aaa");
    cout<< s1 <<endl;  
    return 0;
}
程序运行结果如下:

12345aaa0
12345aaa0

同样的,该函数会有溢出的问题,如果第一个参数越界则会抛出异常。在第一个参数没有越界的前提下,第二个参数如果导致越界,则会选择以下两个值中的最小值作为待替换子字符串的长度:
  • 第二个参数的实参值;
  • 字符串长度减去第一个参数的实参值。

也就是说,替换字符串最多到字符串结尾处,这个与 erase() 函数相同。

string swap()函数

swap() 函数可以用于将两个 string 类型变量的值互换,其使用方式见例 5。

【例 5】
#include <iostream>
#include <string>

using namespace std;

int main()
{
    string s1 = "string";
    string s2 = "aaaaaa";
    s1.swap(s2);
    cout<< s1 <<endl;
    cout<< s2 <<endl;
    return 0;
}
程序运行结果如下:

aaaaaa
string