C++ 字符串详解
                           
天天向上
发布: 2025-03-29 15:06:02

原创
254 人浏览过

在 C++ 中,字符串(String)用于表示 文本数据。C++ 提供了 C 风格的字符串(char 数组)C++ STL 标准字符串(std::string) 两种方式处理字符串。本文将详细介绍 C++ 中字符串的定义、操作、函数、拼接、输入输出、指针与字符串的关系、动态字符串以及 std::stringstd::stringstream 的用法。


1. C++ 字符串的表示方式

1.1 C 风格字符串(C-String)

C 风格字符串是 字符数组,以 '\0' 结尾空字符)。

char str1[] = "Hello";  // 自动在末尾加 '\0'
char str2[6] = "World"; // 指定大小 6,含 '\0'
char str3[] = {'C', '+', '+', '\0'}; // 手动加 '\0'

注意: char str3[] = {'C', '+', '+'}; 不是字符串,因为没有 '\0' 终止符。


1.2 std::string(C++ STL 字符串)

C++ std::string更强大、更安全的字符串类

#include <iostream>
#include <string>

using namespace std;

int main() {
    string str = "Hello, C++!";
    cout << str << endl; // 输出 Hello, C++!
    return 0;
}

优点: 自动管理内存,支持动态扩展,提供丰富的成员函数。


2. C 风格字符串操作(cstring 头文件)

2.1 计算字符串长度 strlen()

#include <iostream>
#include <cstring>

using namespace std;

int main() {
    char str[] = "Hello";
    cout << "Length: " << strlen(str) << endl; // 输出 5(不包含 '\0')
    return 0;
}

2.2 复制字符串 strcpy()

char src[] = "C++";
char dest[10];
strcpy(dest, src);
cout << dest; // 输出 C++

2.3 连接字符串 strcat()

char str1[20] = "Hello, ";
char str2[] = "World!";
strcat(str1, str2);
cout << str1; // 输出 Hello, World!

2.4 比较字符串 strcmp()

if (strcmp("abc", "abd") < 0) {
    cout << "abc < abd";
}

返回值:

  • 0 表示相等
  • <0 表示 str1 < str2
  • >0 表示 str1 > str2

3. std::string 常见操作

3.1 初始化字符串

string str1 = "Hello";
string str2("World");
string str3(str1); // 拷贝构造

3.2 获取字符串长度

cout << str1.length();  // 5
cout << str1.size();    // 5

3.3 连接字符串 + / append()

string str1 = "Hello";
string str2 = " C++";
string result = str1 + str2;
cout << result; // 输出 Hello C++
string str = "Hello";
str.append(", World!");
cout << str; // 输出 Hello, World!

3.4 访问字符 [] / at()

cout << str[1];    // 'e'
cout << str.at(1); // 'e',带边界检查

3.5 插入字符串 insert()

string str = "Hello!";
str.insert(5, ", World");
cout << str; // 输出 Hello, World!

3.6 删除字符 erase()

string str = "Hello, World!";
str.erase(5, 7); // 从索引 5 开始删除 7 个字符
cout << str; // 输出 Hello!

3.7 查找子串 find()

string str = "Hello, C++!";
size_t pos = str.find("C++");
if (pos != string::npos) {
    cout << "Found at: " << pos; // 输出 Found at: 7
}

3.8 截取子串 substr()

string str = "Hello, World!";
string sub = str.substr(7, 5); // 从索引 7 开始,取 5 个字符
cout << sub; // 输出 World

3.9 替换子串 replace()

string str = "Hello, World!";
str.replace(7, 5, "C++");
cout << str; // 输出 Hello, C++!

4. C 风格字符串与 std::string 互相转换

4.1 C 风格字符串 → std::string

const char* cstr = "Hello";
string str(cstr);

4.2 std::string → C 风格字符串

string str = "Hello";
const char* cstr = str.c_str();

注意: c_str() 返回的 C 风格字符串 不可修改


5. 字符串输入输出

5.1 读取整行 getline()

string str;
getline(cin, str);

5.2 读取单词 cin

string word;
cin >> word;

cin 只读取 第一个空格前 的字符。


6. std::stringstream(字符串流)

std::stringstream 用于 字符串解析拼接

#include <iostream>
#include <sstream>
using namespace std;

int main() {
    stringstream ss;
    ss << "Hello " << 123 << " World!";
    string result = ss.str();
    cout << result; // 输出 Hello 123 World!
}

优点: 适合处理 数字和字符串混合 的情况。


7. 动态字符串(new & delete

char* str = new char[100]; // 申请动态数组
strcpy(str, "Hello, Dynamic String!");
cout << str;
delete[] str; // 释放内存

推荐用 std::string 代替动态字符串,自动管理内存。


8. 总结

  • C 风格字符串 (char[]) '\0' 结尾,但操作不安全,建议用 std::string
  • std::string 更方便,支持 拼接、查找、替换、截取等操作
  • std::stringstream 适合字符串解析拼接
  • 动态字符串需要手动管理内存,建议用 std::string 代替。

更多详细内容请关注其他相关文章!

发表回复 0

Your email address will not be published. Required fields are marked *