Appearance
C++ 字符串
字符串是字符序列,用于表示文本。C++ 提供了两种处理字符串的方式:C 风格字符串和 C++ 标准库中的std::string类。
1. C 风格字符串
C 风格字符串是以空字符'\0'结尾的字符数组。
1.1 声明和初始化
cpp
#include <iostream>
int main() {
// 声明并初始化 C 风格字符串
char str1[] = "Hello";
char str2[] = {'H', 'e', 'l', 'l', 'o', '\0'};
std::cout << str1 << std::endl;
std::cout << str2 << std::endl;
return 0;
}1.2 字符串函数
C 风格字符串的操作函数定义在<cstring>头文件中。
| 函数 | 描述 | 示例 |
|---|---|---|
strlen(str) | 返回字符串的长度 | strlen("Hello") 返回 5 |
strcpy(dest, src) | 将 src 复制到 dest | strcpy(dest, "Hello") |
strcat(dest, src) | 将 src 追加到 dest | strcat(dest, "World") |
strcmp(str1, str2) | 比较两个字符串 | strcmp("Hello", "World") |
strchr(str, ch) | 查找字符 ch 在 str 中的位置 | strchr("Hello", 'l') |
strstr(str1, str2) | 查找 str2 在 str1 中的位置 | strstr("Hello", "ell") |
示例
cpp
#include <iostream>
#include <cstring>
int main() {
char str1[20] = "Hello";
char str2[20] = "World";
// strlen
std::cout << "str1 的长度: " << strlen(str1) << std::endl;
// strcpy
char dest[20];
strcpy(dest, str1);
std::cout << "dest: " << dest << std::endl;
// strcat
strcat(str1, " ");
strcat(str1, str2);
std::cout << "str1: " << str1 << std::endl;
// strcmp
int result = strcmp("Hello", "World");
std::cout << "strcmp 结果: " << result << std::endl;
return 0;
}2. std::string 类
std::string类是 C++ 标准库中提供的字符串类,使用起来更加方便和安全。
2.1 声明和初始化
cpp
#include <iostream>
#include <string>
int main() {
// 声明并初始化 string
std::string str1 = "Hello";
std::string str2("World");
std::string str3(5, 'a'); // "aaaaa"
std::cout << str1 << std::endl;
std::cout << str2 << std::endl;
std::cout << str3 << std::endl;
return 0;
}2.2 字符串操作
2.2.1 拼接字符串
cpp
#include <iostream>
#include <string>
int main() {
std::string str1 = "Hello";
std::string str2 = "World";
// 使用 + 运算符
std::string str3 = str1 + " " + str2;
std::cout << str3 << std::endl;
// 使用 append 函数
std::string str4 = str1;
str4.append(" ");
str4.append(str2);
std::cout << str4 << std::endl;
return 0;
}2.2.2 获取字符串长度
cpp
#include <iostream>
#include <string>
int main() {
std::string str = "Hello";
// 使用 length 函数
std::cout << "字符串长度: " << str.length() << std::endl;
// 使用 size 函数
std::cout << "字符串大小: " << str.size() << std::endl;
return 0;
}2.2.3 访问字符串中的字符
cpp
#include <iostream>
#include <string>
int main() {
std::string str = "Hello";
// 使用下标运算符
std::cout << "第一个字符: " << str[0] << std::endl;
// 使用 at 函数(会检查边界)
std::cout << "第二个字符: " << str.at(1) << std::endl;
// 修改字符
str[0] = 'h';
std::cout << str << std::endl;
return 0;
}2.2.4 查找子字符串
cpp
#include <iostream>
#include <string>
int main() {
std::string str = "Hello, World!";
// 查找子字符串
size_t pos = str.find("World");
if (pos != std::string::npos) {
std::cout << "找到 'World' 在位置: " << pos << std::endl;
}
return 0;
}2.2.5 替换子字符串
cpp
#include <iostream>
#include <string>
int main() {
std::string str = "Hello, World!";
// 替换子字符串
str.replace(7, 5, "C++");
std::cout << str << std::endl;
return 0;
}2.2.6 删除子字符串
cpp
#include <iostream>
#include <string>
int main() {
std::string str = "Hello, World!";
// 删除子字符串
str.erase(5, 2); // 从位置 5 开始删除 2 个字符
std::cout << str << std::endl;
return 0;
}2.2.7 提取子字符串
cpp
#include <iostream>
#include <string>
int main() {
std::string str = "Hello, World!";
// 提取子字符串
std::string substr = str.substr(7, 5); // 从位置 7 开始提取 5 个字符
std::cout << substr << std::endl;
return 0;
}2.2.8 比较字符串
cpp
#include <iostream>
#include <string>
int main() {
std::string str1 = "Hello";
std::string str2 = "World";
// 使用比较运算符
if (str1 == str2) {
std::cout << "字符串相等" << std::endl;
} else {
std::cout << "字符串不相等" << std::endl;
}
// 使用 compare 函数
int result = str1.compare(str2);
if (result == 0) {
std::cout << "字符串相等" << std::endl;
} else if (result < 0) {
std::cout << "str1 小于 str2" << std::endl;
} else {
std::cout << "str1 大于 str2" << std::endl;
}
return 0;
}3. 字符串输入输出
3.1 输入字符串
cpp
#include <iostream>
#include <string>
int main() {
std::string name;
// 使用 cin(遇到空格停止)
std::cout << "请输入你的名字: ";
std::cin >> name;
std::cout << "名字: " << name << std::endl;
// 使用 getline(读取整行)
std::cin.ignore(); // 清除缓冲区
std::string full_name;
std::cout << "请输入你的全名: ";
std::getline(std::cin, full_name);
std::cout << "全名: " << full_name << std::endl;
return 0;
}3.2 输出字符串
cpp
#include <iostream>
#include <string>
int main() {
std::string str = "Hello, World!";
// 使用 cout
std::cout << str << std::endl;
// 使用 c_str 转换为 C 风格字符串
printf("%s\n", str.c_str());
return 0;
}4. 字符串的转换
4.1 数字转字符串
cpp
#include <iostream>
#include <string>
int main() {
int num = 123;
double pi = 3.14;
// 使用 to_string 函数
std::string str1 = std::to_string(num);
std::string str2 = std::to_string(pi);
std::cout << str1 << std::endl;
std::cout << str2 << std::endl;
return 0;
}4.2 字符串转数字
cpp
#include <iostream>
#include <string>
int main() {
std::string str1 = "123";
std::string str2 = "3.14";
// 使用 stoi 函数
int num = std::stoi(str1);
std::cout << num << std::endl;
// 使用 stod 函数
double pi = std::stod(str2);
std::cout << pi << std::endl;
return 0;
}5. 字符串的遍历
5.1 使用下标遍历
cpp
#include <iostream>
#include <string>
int main() {
std::string str = "Hello";
for (size_t i = 0; i < str.length(); i++) {
std::cout << str[i] << " ";
}
std::cout << std::endl;
return 0;
}5.2 使用范围 for 循环(C++11)
cpp
#include <iostream>
#include <string>
int main() {
std::string str = "Hello";
for (char ch : str) {
std::cout << ch << " ";
}
std::cout << std::endl;
return 0;
}5.3 使用迭代器
cpp
#include <iostream>
#include <string>
int main() {
std::string str = "Hello";
for (std::string::iterator it = str.begin(); it != str.end(); ++it) {
std::cout << *it << " ";
}
std::cout << std::endl;
return 0;
}6. 示例:综合运用
现在,让我们看一个综合运用各种字符串操作的例子:
cpp
#include <iostream>
#include <string>
int main() {
// 声明和初始化 string
std::cout << "声明和初始化 string:" << std::endl;
std::string str1 = "Hello";
std::string str2("World");
std::cout << str1 << " " << str2 << std::endl;
std::cout << std::endl;
// 拼接字符串
std::cout << "拼接字符串:" << std::endl;
std::string str3 = str1 + " " + str2;
std::cout << str3 << std::endl;
std::cout << std::endl;
// 获取字符串长度
std::cout << "获取字符串长度:" << std::endl;
std::cout << "字符串长度: " << str3.length() << std::endl;
std::cout << std::endl;
// 访问字符串中的字符
std::cout << "访问字符串中的字符:" << std::endl;
std::cout << "第一个字符: " << str3[0] << std::endl;
std::cout << std::endl;
// 查找子字符串
std::cout << "查找子字符串:" << std::endl;
size_t pos = str3.find("World");
if (pos != std::string::npos) {
std::cout << "找到 'World' 在位置: " << pos << std::endl;
}
std::cout << std::endl;
// 替换子字符串
std::cout << "替换子字符串:" << std::endl;
str3.replace(7, 5, "C++");
std::cout << str3 << std::endl;
std::cout << std::endl;
// 提取子字符串
std::cout << "提取子字符串:" << std::endl;
std::string substr = str3.substr(7, 3);
std::cout << substr << std::endl;
std::cout << std::endl;
// 比较字符串
std::cout << "比较字符串:" << std::endl;
std::string str4 = "Hello";
std::string str5 = "Hello";
if (str4 == str5) {
std::cout << "字符串相等" << std::endl;
}
std::cout << std::endl;
// 数字转字符串
std::cout << "数字转字符串:" << std::endl;
int num = 123;
std::string str_num = std::to_string(num);
std::cout << str_num << std::endl;
std::cout << std::endl;
// 字符串转数字
std::cout << "字符串转数字:" << std::endl;
std::string str_num2 = "456";
int num2 = std::stoi(str_num2);
std::cout << num2 << std::endl;
std::cout << std::endl;
// 遍历字符串
std::cout << "遍历字符串:" << std::endl;
for (char ch : str3) {
std::cout << ch << " ";
}
std::cout << std::endl;
return 0;
}小结
C++ 字符串包括:
C 风格字符串:
- 以空字符
'\0'结尾的字符数组 - 使用
<cstring>头文件中的函数操作
- 以空字符
std::string 类:
- C++ 标准库中的字符串类
- 使用起来更加方便和安全
字符串操作:
- 拼接字符串:
+运算符或append函数 - 获取字符串长度:
length或size函数 - 访问字符串中的字符:下标运算符或
at函数 - 查找子字符串:
find函数 - 替换子字符串:
replace函数 - 删除子字符串:
erase函数 - 提取子字符串:
substr函数 - 比较字符串:比较运算符或
compare函数
- 拼接字符串:
字符串输入输出:
- 输入:
std::cin或std::getline - 输出:
std::cout
- 输入:
字符串的转换:
- 数字转字符串:
std::to_string - 字符串转数字:
std::stoi、std::stod等
- 数字转字符串:
字符串的遍历:
- 使用下标遍历
- 使用范围 for 循环(C++11)
- 使用迭代器
关键概念:
- C 风格字符串:以空字符结尾的字符数组
- std::string 类:C++ 标准库中的字符串类
- 字符串操作:拼接、查找、替换、删除、提取、比较等
掌握字符串是编写 C++ 程序的基础,在后续章节中,我们将学习 C++ 的指针。