C++ 字符串详解
在 C++ 中,字符串(String)用于表示 文本数据。C++ 提供了 C 风格的字符串(char 数组) 和 C++ STL 标准字符串(std::string) 两种方式处理字符串。本文将详细介绍 C++ 中字符串的定义、操作、函数、拼接、输入输出、指针与字符串的关系、动态字符串以及 std::string 和 std::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代替。
更多详细内容请关注其他相关文章!