#5414. 字符串笔记
字符串笔记
C++ 字符与字符串学习笔记(整合版)
目录
- ASCII 码基础
- 字符与字符串数据类型
- 字符串输入输出方法
- 字符判断与转换技巧
- 字符串基础操作(拼接、长度、索引)
- 字符串常用函数(erase/find/insert等)
- 字符数组与字符串长度
- 字符串比较规则
- 回文判断方法
- 字符串与数字互转
- 字符统计案例
- 示例代码与应用
一、ASCII 码基础
ASCII(American Standard Code for Information Interchange)是基于拉丁字母的编码系统,用于表示字符与数字的对应关系。
核心要点
- 每个字符对应 0-127 之间的整数(存储时以该整数形式存在)
- 常用字符的 ASCII 范围:
| 字符类型 | ASCII 码范围 | 示例(字符→ASCII值) |
|---|---|---|
| 数字 0-9 | 48-57 | '0'→48,'5'→53 |
| 大写字母A-Z | 65-90 | 'A'→65,'Z'→90 |
| 小写字母a-z | 97-122 | 'a'→97,'z'→122 |
应用价值
字符与整数可直接转换(如判断字符类型、转换大小写时需用到)。
二、字符与字符串数据类型
1. 字符类型(char)
- 用于存储单个字符,用单引号
' '定义 - 本质是存储 ASCII 码对应的整数
char c1 = 'A'; // 存储 ASCII 码 65
char c2 = 98; // 等价于 'b'(98 是 'b' 的 ASCII 码)
2. 字符串类型(两种表示方式)
| 类型 | 定义方式 | 特点 |
|---|---|---|
| 字符数组 | char arr[100]; |
C风格字符串,需手动管理长度,以 \0 作为结束标志(可省略显式定义) |
| string 类 | string s = "Hello"; |
C++ 高级封装类型,自带操作函数(需包含 <string> 头文件) |
- 推荐使用 string 类型:无需关心内存管理,支持丰富的内置函数。
三、字符串输入输出方法
根据需求选择输入方式(是否包含空格),输出均通过 cout 实现。
1. 输入方法
| 输入方式 | 语法 | 特点 | 适用场景 |
|---|---|---|---|
| cin 输入 | cin >> s;(s为string/字符数组) |
遇到空格、制表符、换行符停止读取 | 输入不含空格的字符串 |
| getline 输入 | getline(cin, s);(仅支持string) |
读取整行内容(包括空格),直到换行符 | 输入含空格的字符串 |
注意:cin 后直接使用 getline 可能读取空行(需先用 cin.ignore() 清除缓存)。
2. 输出方法
string s = "Hello";
char arr[] = "World";
cout << s << " " << arr; // 输出:Hello World
四、字符判断与转换技巧
1. 字符类型判断(基于ASCII范围)
| 判断目标 | 条件表达式 | 示例代码 |
|---|---|---|
| 是否为大写字母 | c >= 'A' && c <= 'Z' |
if (c >= 'A' && c <= 'Z') cout << "大写字母"; |
| 是否为小写字母 | c >= 'a' && c <= 'z' |
if (c >= 'a' && c <= 'z') cout << "小写字母"; |
| 是否为数字字符 | c >= '0' && c <= '9' |
if (c >= '0' && c <= '9') cout << "数字字符"; |
2. 字符转换技巧
| 转换目标 | 方法(原理:利用ASCII码差值) | 示例代码 |
|---|---|---|
| 大写字母转小写 | 加32('A'与'a'差值为32) | char c = 'A'; c += 32; // 结果为 'a' |
| 小写字母转大写 | 减32 | char c = 'b'; c -= 32; // 结果为 'B' |
| 数字字符转整数 | 减 '0'(如'5' - '0' = 5) | char c = '5'; int num = c - '0'; // 结果为5 |
| 整数转数字字符 | 加 '0'(如3 + '0' = '3') | int num = 3; char c = num + '0'; // 结果为'3' |
五、字符串基础操作
1. 字符串拼接
- 支持
+运算符直接拼接(string 类型)
string s1 = "abc", s2 = "def";
string s3 = s1 + s2; // s3 = "abcdef"
string s4 = s1 + 'g'; // s4 = "abcg"(字符串+单个字符)
2. 字符串长度
获取长度是遍历、操作字符串的基础。
| 字符串类型 | 长度获取方法 | 示例代码 |
|---|---|---|
| 字符数组 | strlen(数组名)(需包含 <cstring>) |
char arr[] = "abc"; int len = strlen(arr); // len=3 |
| string 类型 | s.size() 或 s.length() |
string s = "abc"; int len = s.size(); // len=3 |
3. 字符串索引
- 从 0 开始(第一个字符为
s[0]),支持通过索引访问单个字符
string s = "hello";
cout << s[0]; // 输出 'h'(第一个字符)
s[1] = 'E'; // 修改后 s 变为 "hEllo"
六、字符串常用函数
string 类型提供丰富的内置函数,简化操作(需包含 <string>)。
| 函数名 | 功能描述 | 示例代码 |
|---|---|---|
s.erase(pos, len) |
删除从 pos 开始的 len 个字符 | string s = "123abc"; s.erase(1, 2); // s 变为 "1abc"(删除索引1开始的2个字符) |
s.find(str, pos) |
从 pos 位置开始查找 str 第一次出现的位置(默认从0开始),找不到返回 string::npos |
string s = "abcabc"; int p = s.find("ab"); // p=0("ab"首次出现在索引0) |
s.insert(pos, str) |
在 pos 位置前插入字符串 str | string s = "abc"; s.insert(1, "xy"); // s 变为 "axybc"(在索引1前插入"xy") |
s.substr(pos, len) |
截取从 pos 开始、长度为 len 的子串(len 省略则取到末尾) | string s = "123456"; string sub = s.substr(2, 3); // sub = "345" |
s.replace(pos, len, str) |
将 pos 开始的 len 个字符替换为 str | string s = "123abc"; s.replace(2, 2, "xy"); // s 变为 "12xybc" |
七、字符串比较规则
按 字典序 比较(类似字典中单词的排序逻辑):
- 从第一个字符开始,比较对应位置字符的 ASCII 码;
- 若某位置字符不同,ASCII 码小的字符串整体更小;
- 若前面字符都相同,短字符串更小。
string s1 = "apple", s2 = "apply";
string s3 = "app";
cout << (s1 < s2); // 1(true,因第4个字符 'l' < 'y')
cout << (s3 < s1); // 1(true,s3 更短且前缀相同)
- 支持直接使用
<>==等运算符比较(string 类型)。
八、回文判断方法
回文是指“正读和反读都相同”的字符串或数字(如“abcba”“12321”)。
1. 数字回文判断
通过“反转数字”对比原数字实现。
int x = 12321;
int original = x;
int reversed = 0;
// 反转数字
while (x > 0) {
reversed = reversed * 10 + x % 10; // 取末位并累加
x /= 10; // 移除末位
}
if (reversed == original) {
cout << "是回文"; // 12321 反转后还是 12321,输出此结果
}
2. 字符串回文判断
通过“反转字符串”对比原字符串实现。
string s = "abcba";
string reversed_s;
// 反转字符串
for (int i = s.size() - 1; i >= 0; i--) {
reversed_s += s[i];
}
if (reversed_s == s) {
cout << "是回文"; // "abcba" 反转后相同,输出此结果
}
九、字符串与数字互转
实际开发中需频繁转换(如输入数字字符串需计算,结果需拼接成字符串)。
1. 字符串转数字(以正整数为例)
string s = "1234";
int num = 0;
for (int i = 0; i < s.size(); i++) {
num = num * 10 + (s[i] - '0'); // 逐位累加('1'->1,通过减'0'转换)
}
// 结果:num = 1234
2. 数字转字符串(以正整数为例)
int num = 12345;
string s;
while (num > 0) {
int last = num % 10; // 取末位数字
s = char(last + '0') + s; // 转字符后拼到前面(保证顺序正确)
num /= 10; // 移除末位
}
// 结果:s = "12345"
十、字符统计案例
以“统计字符数组中 '1' 出现的次数”为例,展示字符遍历与统计逻辑。
#include <iostream>
#include <cstring> // 包含 strlen 函数
using namespace std;
int main() {
char arr[100];
cin >> arr; // 输入字符数组(不含空格)
int count = 0;
// 遍历数组,统计 '1' 的次数
for (int i = 0; i < strlen(arr); i++) {
if (arr[i] == '1') {
count++;
}
}
cout << " '1' 出现的次数:" << count << endl;
return 0;
}