- C++
C++ `string` 的基础教程
- 2025-6-18 18:37:49 @
以下是一个关于 C++ string
的基础教程,采用通俗易懂的方式讲解,并使用 using namespace std;
简化代码:
1. 什么是 string
?
string
是 C++ 标准库中用于处理文本的类,位于 <string>
头文件中。它比 C 风格的字符数组(如 char[]
)更安全、更方便。
2. 基本用法
2.1 包含头文件与命名空间
#include <iostream>
#include <string> // 包含 string 库
using namespace std; // 避免每次都写 std::
int main() {
// 后续代码...
return 0;
}
2.2 声明与初始化
string s1; // 空字符串
string s2 = "Hello"; // 直接初始化
string s3("World"); // 构造函数初始化
string s4 = s2 + " " + s3; // 拼接字符串 -> "Hello World"
string s5(5, 'a'); // 重复字符 -> "aaaaa"
3. 字符串操作
3.1 输入输出
string name;
cout << "Enter your name: ";
cin >> name; // 读取到空格为止
getline(cin, name); // 读取整行(含空格)
cout << "Hello, " << name << "!";
3.2 拼接
string s1 = "Hello";
string s2 = "World";
string s3 = s1 + " " + s2; // "Hello World"
s1 += "!"; // s1 变为 "Hello!"
3.3 长度与空判断
string s = "Hello";
int len = s.length(); // 或 s.size(),结果为 5
bool isEmpty = s.empty(); // false
if (s == "") { // 等价于 s.empty()
cout << "String is empty";
}
3.4 访问字符
string s = "Hello";
char first = s[0]; // 'H'(不检查越界)
char last = s.at(s.length() - 1); // 'o'(检查越界)
// 修改字符
s[0] = 'J'; // s 变为 "Jello"
4. 常用函数
4.1 查找
string s = "Hello World";
size_t pos = s.find("World"); // 位置 6(从 0 开始)
if (pos != string::npos) { // npos 表示未找到
cout << "Found at position " << pos;
}
// 从指定位置开始查找
size_t pos2 = s.find("l", 3); // 位置 3
4.2 子串
string s = "Hello World";
string sub = s.substr(6, 5); // 从位置 6 开始,长度 5 -> "World"
string sub2 = s.substr(6); // 从位置 6 到末尾 -> "World"
4.3 替换与插入
string s = "Hello";
s.replace(1, 3, "i"); // 从位置 1 开始的 3 个字符替换为 "i" -> "Hi"
s.insert(1, "ello"); // 在位置 1 插入字符串 -> "Hello"
4.4 删除
string s = "Hello World";
s.erase(5); // 删除从位置 5 到末尾 -> "Hello"
s.erase(1, 3); // 从位置 1 开始删除 3 个字符 -> "Ho"
s.clear(); // 清空字符串
5. 与 C 风格字符串的转换
5.1 string
转 const char*
string s = "Hello";
const char* cstr = s.c_str(); // 用于需要 C 风格字符串的函数
5.2 const char*
转 string
const char* cstr = "Hello";
string s = cstr; // 自动转换
6. 示例程序
#include <iostream>
#include <string>
using namespace std;
int main() {
string name;
cout << "Enter your name: ";
getline(cin, name);
if (!name.empty()) {
string greeting = "Hello, " + name + "!";
cout << greeting << endl;
// 反转字符串(练习)
string reversed = "";
for (int i = name.length() - 1; i >= 0; i--) {
reversed += name[i];
}
cout << "Reversed: " << reversed << endl;
}
return 0;
}
7. 注意事项
string
是类:它会自动管理内存,无需手动释放。- 性能:频繁拼接字符串时,使用
stringstream
更高效。 - 越界风险:
[]
不检查越界,at()
会抛出异常。
总结
string
是 C++ 中处理文本的首选方式,它提供了丰富的功能和安全性。通过 using namespace std;
可以简化代码书写,但在大型项目中建议慎用,避免命名冲突。
2 条评论
-
admin SU @ 2025-6-18 18:45:38
以下是关于 C++ 中 字符处理函数(如
tolower
、toupper
等)的基础教程,采用通俗易懂的方式讲解,并使用using namespace std;
:1. 字符处理函数概述
C++ 提供了一系列用于处理单个字符的函数,位于
<cctype>
头文件中。这些函数可用于判断字符类型(如是否为字母、数字)或转换字符大小写。
特点:- 输入输出均为
int
类型(实际为char
的 ASCII 值)。 - 处理的字符必须是 ASCII 范围内 的值,否则行为未定义。
2. 常用字符处理函数
2.1 大小写转换
函数 功能 示例 tolower(int c)
将字符转为小写(非字母不变) tolower('A')
→'a'
tolower('1')
→'1'
toupper(int c)
将字符转为大写(非字母不变) toupper('b')
→'B'
toupper('$')
→'$'
示例代码:
#include <iostream> #include <cctype> // 包含字符处理函数 using namespace std; int main() { char c1 = 'A'; char c2 = tolower(c1); // 'a' char c3 = '7'; char c4 = toupper(c3); // '7'(非字母不变) cout << c2 << ", " << c4 << endl; // 输出: a, 7 return 0; }
2.2 字符类型判断
函数 功能 返回值( bool
)isalpha(int c)
判断是否为字母(a-z, A-Z) 是 → true
,否 →false
isdigit(int c)
判断是否为数字(0-9) isalnum(int c)
判断是否为字母或数字( isalpha
或isdigit
)isspace(int c)
判断是否为空白字符(空格、制表符、换行符等) ispunct(int c)
判断是否为标点符号(非字母、数字、空白的字符) isupper(int c)
判断是否为大写字母(A-Z) islower(int c)
判断是否为小写字母(a-z) 示例代码:
char c = '!'; cout << isalpha(c) << endl; // 0(false) cout << ispunct(c) << endl; // 1(true) cout << isspace('\t') << endl; // 1(true,制表符是空白字符)
3. 注意事项
-
输入类型为
int
函数参数为int
,但实际处理的是char
的 ASCII 值。若传入超出 ASCII 范围的整数,结果未定义。 -
返回值为
int
tolower
/toupper
的返回值需显式转换为char
:char c = 'A'; char lower = static_cast<char>(tolower(c)); // 推荐显式转换
- 直接赋值可能导致隐式转换(如
int
转char
),但在 ASCII 范围内通常安全。
-
国际化限制
这些函数仅适用于 ASCII 字符集。对于 Unicode 或多字节字符(如中文),需使用<locale>
或<codecvt>
库。
4. 实际应用场景
4.1 字符串大小写转换
#include <iostream> #include <cctype> #include <string> using namespace std; int main() { string str = "Hello, World!"; // 转为小写 for (char& c : str) { c = tolower(c); } cout << str << endl; // 输出: hello, world! // 转为大写 for (char& c : str) { c = toupper(c); } cout << str << endl; // 输出: HELLO, WORLD! return 0; }
4.2 过滤非数字字符
string input = "a1b2c3"; string digits; for (char c : input) { if (isdigit(c)) { digits += c; } } cout << digits << endl; // 输出: 123
4.3 统计各类字符数量
string text = "Hello, 123!"; int letters = 0, numbers = 0, spaces = 0, puncts = 0; for (char c : text) { if (isalpha(c)) letters++; else if (isdigit(c)) numbers++; else if (isspace(c)) spaces++; else if (ispunct(c)) puncts++; } cout << "Letters: " << letters << endl; // 5 cout << "Numbers: " << numbers << endl; // 3 cout << "Spaces: " << spaces << endl; // 1 cout << "Punctuation: " << puncts << endl; // 1
5. 与 C 语言的区别
C++ 的字符处理函数与 C 语言基本相同,但 C++ 提供了更安全的类型检查。例如:
- C++ 中
tolower
的参数必须是可隐式转换为int
的类型(如char
),而 C 语言允许传递任意类型。
总结
字符处理函数(如
tolower
、isalpha
)是 C++ 中处理文本的基础工具,适用于简单的字符转换和判断。使用时需注意:- 包含
<cctype>
头文件。 - 输入输出为
int
类型,处理 ASCII 范围内的字符。 - 对于复杂文本处理(如国际化),需使用更高级的库。
通过这些函数,你可以轻松实现字符串的大小写转换、字符类型过滤等操作。
- 输入输出均为
-
2025-6-18 18:38:49@
以下是使用表格形式整理的 C++
string
常用用法,包含示例代码和说明:C++
string
用法速查表操作 代码示例 说明 声明与初始化 空字符串 string s;
创建空字符串,长度为 0。 直接赋值 string s = "Hello";
用 C 风格字符串初始化。 构造函数 string s("World");
同上,使用构造函数语法。 重复字符 string s(5, 'a');
创建包含 5 个 'a'
的字符串:"aaaaa"
。拷贝初始化 string s2 = s1;
复制另一个字符串。 访问与修改 通过下标访问 char c = s[0];
获取第 0 个字符(不检查越界)。 通过 at()
访问char c = s.at(0);
同上,但越界时抛出 out_of_range
异常。修改字符 s[0] = 'H';
将第 0 个字符改为 'H'
。长度与空判断 获取长度 int len = s.length();
返回字符串长度(字符数)。 空字符串检查 bool empty = s.empty();
等价于 s.length() == 0
。拼接与追加 加号拼接 string s3 = s1 + " " + s2;
返回拼接后的新字符串。 追加字符串 s1 += " World";
在原字符串末尾追加内容。 追加字符 s1.push_back('!');
在原字符串末尾添加一个字符。 查找与替换 查找子串 size_t pos = s.find("World");
返回子串首次出现的位置,未找到返回 string::npos
。从指定位置查找 s.find("l", 3);
从位置 3 开始查找 'l'
。替换子串 s.replace(1, 3, "i");
将位置 1 开始的 3 个字符替换为 "i"
。子串与插入 获取子串 string sub = s.substr(6, 5);
从位置 6 开始截取长度为 5 的子串。 插入字符串 s.insert(1, "ello");
在位置 1 插入字符串。 删除与清空 删除部分内容 s.erase(5);
删除从位置 5 到末尾的所有字符。 删除指定范围 s.erase(1, 3);
删除从位置 1 开始的 3 个字符。 清空字符串 s.clear();
清空字符串内容,长度变为 0。 比较 相等判断 if (s1 == s2) {...}
按字典序比较,返回 bool
。字典序比较 int cmp = s1.compare(s2);
返回 0(相等)、负数(s1 < s2)或正数(s1 > s2)。 转换 转为 C 风格字符串 const char* cstr = s.c_str();
用于需要 const char*
的函数(如printf
)。数字转字符串 string num = to_string(123);
将整数/浮点数转为字符串。 字符串转数字 int n = stoi("123");
支持 stoi
(整数)、stod
(双精度)等。示例代码
#include <iostream> #include <string> using namespace std; int main() { // 初始化 string s1 = "Hello"; string s2(5, 'a'); // "aaaaa" // 拼接 string s3 = s1 + " " + s2; // "Hello aaaaa" // 修改 s3[6] = 'b'; // "Hello baaaa" // 查找 size_t pos = s3.find("baa"); // 位置 6 // 子串 string sub = s3.substr(6, 3); // "baa" // 替换 s3.replace(6, 3, "BAA"); // "Hello BAAaaa" // 输出 cout << "Length: " << s3.length() << endl; // 12 cout << "s3: " << s3 << endl; // "Hello BAAaaa" return 0; }
注意事项
- 越界风险:
[]
不检查越界,at()
更安全但性能略低。 string::npos
:查找失败时返回的特殊值,通常为size_t
的最大值。- 性能优化:频繁拼接时建议用
stringstream
或reserve()
预分配空间。
通过这张表格,你可以快速掌握
string
的核心用法。 - 越界风险:
- 1