#5414. 字符串笔记

字符串笔记

C++ 字符与字符串学习笔记(整合版)

目录

  1. ASCII 码基础
  2. 字符与字符串数据类型
  3. 字符串输入输出方法
  4. 字符判断与转换技巧
  5. 字符串基础操作(拼接、长度、索引)
  6. 字符串常用函数(erase/find/insert等)
  7. 字符数组与字符串长度
  8. 字符串比较规则
  9. 回文判断方法
  10. 字符串与数字互转
  11. 字符统计案例
  12. 示例代码与应用

一、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"

七、字符串比较规则

字典序 比较(类似字典中单词的排序逻辑):

  1. 从第一个字符开始,比较对应位置字符的 ASCII 码;
  2. 若某位置字符不同,ASCII 码小的字符串整体更小;
  3. 若前面字符都相同,短字符串更小。
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;
}