当前位置 : 主页 > 编程语言 > 其它开发 >

C++ string 字符串类详解

来源:互联网 收集:自由互联 发布时间:2022-05-30
C++ string 字符串类详解:简洁清晰地介绍了各种【string的使用方法】,其中包含了所有【string常用函数】。 目录 简介 string 类使用方法 1. 头文件 + 命名空间 2. 定义 / 构造 / 初始化 3. 读
C++ string 字符串类详解:简洁清晰地介绍了各种【string的使用方法】,其中包含了所有【string常用函数】。

目录
  • 简介
  • string 类使用方法
    • 1. 头文件 + 命名空间
    • 2. 定义 / 构造 / 初始化
    • 3. 读取 / 输入
    • 4. 简单基本操作
    • 5. 字符串拼接
    • 6. 数值 → 字符串
    • 7. 字符串 → 数值
    • 8. 插入 / 删除
    • 9. 提取子字符串
    • 10. 查找子字符串

简介
  • 为什么选择使用 string 来表示字符串?char 不足够吗?

    在 C++ 中,字符的数据类型是 char,但是使用 char 只能表示单个字符

    若要表示一个字符串,就需要使用字符数组 char[]

    可是,在使用 char[] 时有一个弊端:

    如果需要输出字符串时,需要循环遍历字符数组中的每一个元素。

    这种时候,使用 string 类会更方便处理字符串。

  • string 字符串类的特点

    1. 没有固定的长度,不需要提前确认存储的字符串长度

    2. 直接将字符串存为一个变量,而不是多个字符

回到顶部

string 类使用方法 1. 头文件 + 命名空间

C++ 中,使用 string 字符串类需要包含头文件 #include<string>

由于 string 属于命名空间 std 的范畴,因此,也需要声明使用的命名空间。

// (A) 头文件
#include <string>

// (B) 命名空间
// 方法1:直接声明使用整个命名空间
using namespace std;
string s1;

// 方法2:不直接声明整个命名空间,在使用 string 时需要用:
std::string s1;

回到顶部

2. 定义 / 构造 / 初始化
// (A) 定义一个默认的空字符串
string s1;

// (B) 定义 + 用字符串初始化
string s2("happy");
string s2 = "happy";

// (C) 用已有的字符串构造新的字符串
string s3(s2);                          
string s3(s2, 1, 3);                     // 以s2的下标为1的字符为起点,取3个字符,s3 = "app"
string s3(s2.begin(), s2.begin() + 4);   // s3 = "happ"
string s3("happy life", 8);              // 从字符串中取前8个字符,s3 = "happy li"

// (D) 用单个字符进行构造
string s4(5,'h');                        // s4 = "hhhhh"

回到顶部

3. 读取 / 输入
string name;

// 方法1:读取字符串,遇到空格时停止
cin >> name;

// 方法2:读取完整的一行
getline(cin, name);

// 方法3:读取,直到指定的分隔符才停止
getline(cin, name, '@');

/* 
   如果输入数据为:
   Karry Wang
   Zhuang WenJie
   @
   使用以上三种方法,得到的 name 为:
   方法1   Karry
   方法2   Karry Wang
   方法3   Karry Wang\nZhuang WenJie\n
*/

回到顶部

4. 简单基本操作
// 使用下标访问
cout << str[1];

// 使用范围遍历
for(char c: str) {
    cout << c << " ";
}

// 清空元素
str.clear();

// 检查是否为空
if(str.empty()) {
    ......
}

// 查询字符串长度
cout << str.size();
cout << str.length();

// 比较字符串大小(字典序考前的较小)
string s1 = "abc", s2 = "bde";
if(s1 < s2) { ... }
if(s1 == s2) { ... }
if(s1 > s2) { ... }

// 转换为 C 风格字符串
string word = "happy";
word.c_str();

回到顶部

5. 字符串拼接
// 添加单个字符
str.pushback('a');

// 添加字符串
str.append(s2);
str += s2;

// 拼接不同的字符或字符串
// 可以拼接多种数据类型,如:string、char、char*、char[]
string s1 = "live";
string s2 = "happy";
char s3 = 'a';
char* s4 = "life";
char s5[] = "together";

string str = s1 + s2;
string str = s1 + s3;
string str = s1 + s4;
string str = s1 + s5;

回到顶部

6. 数值 → 字符串
// int 转换成 string
string str = to_string(1);
string str = to_string(2 + 5);

// -------------------------------------------------
// double 转换成 string
string str1 = to_string(3.14);
string str2 = to_string(3.14159265);
/* 注意:str1 = "3.140000", str2 = "3.141593",
   太短会自动补零,太长也会造成精度损失 */

回到顶部

7. 字符串 → 数值
// string 转换成 int
int a = stoi("21");
int b = stoi("3.14");
// 转换结果:a = 21, b = 3

// 将 string 中的整数转换成 int,同时返回转换的长度
string::size_type sz;
int c = stoi("21 girls", &sz);
// 转换结果:c = 21, sz = 2 

// 将16进制的 string 转换成10进制的 int
int d = stoi("0x40c3", nullptr, 16);
// 转换结果:d = 16579 

// 自动检查进制,转换成10进制的 int
int e = stoi("0x40c3", nullptr, 0);
// 转换结果:3 = 16579 

// -------------------------------------------------
/* 除了转换成 int 之外,也可以转换成 float 或 double
   使用 stof  转换成 float
   使用 stod  转换成 double
*/

回到顶部

8. 插入 / 删除
// 在指定下标的位置插入字符串
string str = "0123456789";
string add = "happy";
str.insert(5, add);
// 插入结果:str = "01234happy56789"

// -------------------------------------------------
string s1, s2; 
s1 = s2 = "0123456789";

// 删除指定下标位置开始的所有字符
s1.erase(5);

// 从指定下标位置开始,删除指定数量的元素
s2.erase(5,3);

// 删除结果:s1 = "01234", s2 = "0123489"

回到顶部

9. 提取子字符串
string s1 = "live a happy life";
string s2;

// 从指定下标位置开始提取指定数量的元素
s2 = s1.substr(7, 10);

回到顶部

10. 查找子字符串
// 查找并返回子字符串第一次出现的下标位置
string s1 = "live a happy happy life";
string s2 = "happy";
int ind = s1.find(s2);
if(ind < s1.length()) {
    cout << "Found at index " << ind;
}
// 输出结果:Found at index 7

回到顶部

网友评论