首页 > 编程笔记 > C++笔记 阅读:404

C++ string字符串类的用法(附带实例)

C++ 提供了 string 类来处理字符串,它在头文件 <string> 中,提供了添加、删除、查找、替换、比较字符串等方法。

创建 string 字符串对象的方法有以下 4 种:
1) 定义字符串,但不进行初始化。例如:
string s1;

2) 定义字符串的同时进行初始化。例如:
string s2 = "12345上山打老虎";

3) 复制其他字符串。例如:
string s3 = s2;

4) 使用 n 个字符 c 来初始化字符串。例如:
string(int n, char c);

例如,下面的代码中变量 s4 被初始化为由 5 个 'a' 字符组成的字符串,也就是 "aaaaa"。
string s4(5,'a');

C++ string类常用函数

string 类中封装了 insert()、erase()、replace()、delete()、find()、substr()、copy() 等成员函数,下面进行介绍。

1、字符串的增、删、改、查函数

1) 插入字符串

insert() 函数可在 pos 位置插入字符串 str,其函数原型如下:
string& insert(size_t pos, const string& str);
其中,pos 表示插入位置,也就是下标;str 表示待插入的字符串。

例如:
s1 = "1234567890";
s2 = "5555";
s1.insert(5, s2);   // 将 s2 插入到 s1 的下标 5 处,插入后 s1 变为 "12345555567890"

2) 删除字符串

erase() 函数可从 pos 位置开始,删除 len 个字符,其函数原型如下:
string& erase(size_t pos = 0, size_t len = npos);
其中,pos 表示待删除字符串的起始下标;len 表示待删除字符串的长度,如果不指定,将删除从 pos 到字符串结束处的所有字符。

例如:
s1 = s2 = s3 = "1234567890";
s2.erase(6);        // 在 s2 中,从下标 6 开始,删除后面所有字符,删除后 s2 变为 "123456"
s3.erase(6, 2);     // 在 s3 中,从下标 6 开始,删除 2 个字符,删除后 s3 变为 "12345690"

3) 替换字符串

replace() 函数可将从 pos 位置开始的 n 个字符替换为 s2,函数原型如下:
replace(int pos, int n, const string &s2);

例如:
s1 = "1234567890";
s2 = "aaa";
s1.replace(5, 3, s2);   // 在 s1 中,将下标 5 开始的 3 个字符替换成 s2,替换后 s1 变为 "12345aaa90"

4) 查找字符串

查找字符串涉及 3 个函数,分别是 find()、rfind() 和 find_first_of()。

find() 函数可从 pos 位置开始,查找字符串 str 第一次出现的位置,并返回其下标。如果查找不到,则返回 −1。函数原型如下:
size_t find(const string& str, size_t pos = 0) const;
其中,str 为待查找的字符串;pos 为查找位置,如果不指定,默认从下标 0 开始查找。

例如:
string s1 = "my black hair";
string s2 = "black";
int index = s1.find(s2);   // 在 s1 中查找 s2 第一次出现的位置,这里返回下标 3

rfind() 函数可从 pos 位置开始,查找字符串 str 最后一次出现的位置并返回其下标;若查找不到,返回 string::npos。函数原型如下:
size_t rfind(const string& str, size_t pos = 0) const;
例如:
string s1 = "my black hair";
string s2 = "black";
int index = s1.rfind(s2, 2);   // 在 s1 中查找 s2 最后一次出现的位置,这里返回下标 3

ind_first_of() 函数用于查找字符串 s2 和字符串 2 共有的字符在字符串 1 中首次出现的位置。例如:
string s1 = "tomorrow is another day";
string s2 = "you";
int index = s1.find_first_of(s2);   // s1 和 s2 共同字符为 'o',该字符在 s1 首次出现的下标是 1

2、提取字符串

substr() 函数可从 pos 位置开始,提取 len 个字符,函数原型如下:
string substr(size_t pos = 0, size_t len = npos);

其中,pos 为待提取字符串的起始下标,len 为待提取字符串的长度。例如:
string s1 = "tomorrow is another day";
string s2;
s2 = s1.substr(9, 2);   // 从下标 9 开始提取 2 个字符,结果为 "is"

3、字符串比较

compare() 函数可从 pos 位置开始,提取 n 个字符,得到的字符串和 s2 进行比较,函数原型如下:
s.compare(size_type pos, size_type n, s2);
若比较结果相同,返回 0;若字符串 s 的字典顺序先于 s2,返回负值,否则返回正值。

【实例 1】对字符串进行比较。定义 4 个字符串,使用 compare() 函数对字符串进行比较,代码如下:
#include <iostream>
#include <string>
using namespace std;

int main() {
    string A("AacdEF");
    string B("AbCdEf");
    string C("123abc");
    string D("123dfg");

    // 下面是各种比较方法
    int m = A.compare(B);               // "AacdEF" 和 "AbCdEf" 完整比较
    int n = A.compare(2, 4, B, 2, 4);   // "cdEF" 和 "CdEf" 比较
    int p = A.compare(4, 2, B);         // "EF" 和 "AbCdEf" 比较
    int q = C.compare(0, 3, D, 0, 3);   // "123" 和 "123" 比较
    string t("E");
    string y("a");
    int z = t.compare(y);               // "E" 和 "a" 比较

    cout << "m = " << m << ", n = " << n << ", p = " << p
         << ", q = " << q << ", z = " << z << endl;
    return 0;
}
compare() 函数可以区分大小写,输出整型数据 m,n,p,q 的值分别为 −1,1,1,0,如下图所示:

m = -1, n = 1, p = 1, q = 0, z = -1

4、获得字符串长度

length() 函数可计算字符串的长度。例如:
string a("AacdEF");
int b = a.length();   // 返回 6

empty() 函数可判断字符串是否为空。如果字符串为空,返回 1,否则返回 0。
string a("AacdEF");
int b = a.empty();   // 返回 0

5、字符串的拼接

C++ 中使用运算符 “+” 可以拼接两个字符串。“+” 的两边可以是:
示例代码:
#include <iostream>
#include <string>
using namespace std;

int main() {
    string s1 = "tomorrow";
    string s2 = "is ";
    char *s3 = "another";
    char s4[] = "day";
    char ch = '!';

    string s5 = s1 + s2 + s3 + s4 + ch;
    cout << s5 << endl;
    return 0;
}
输出字符串 s5 的结果为“tomorrow is another day!”。

转换为C语言风格的字符串

实际编程中,有时候需要将 C++ 字符串转换为 C语言风格的字符串,此时要用到转换函数 c_str()。

例如,要使用 C语言中的 fopen() 函数打开文件路径,就必须进行转换。c_str() 函数可返回待转换字符串的 const 指针(const char*)。例如:
string path = "D:\\demo.txt";   // path 保存了文件路径
FILE *fp = fopen(path.c_str(), "rt");   // 使用 c_str() 转换为 C 风格字符串

相关文章