字符串翻转/替换操作
·
字符串翻转/替换操作完整代码知识点笔记
一、核心头文件与变量定义
1. 必备头文件
#include <stdio.h> // 输入输出函数(scanf/printf)
#include <string.h> // 字符串操作函数(strncpy/strcpy/strlen)
2. 变量定义要点
char str[201];:定义足够大的字符数组(原字符串≤100,预留翻倍空间避免替换后溢出)char cmd[201];:存储命令字符串,需兼容替换内容的长度int n;:记录命令条数;op/start/len:解析命令的操作类型、起始下标、操作长度
二、多组输入处理
1. 核心写法
while (scanf("%s", str) != EOF) { ... }
- 功能:循环读取字符串,直到输入结束(支持多组数据输入)
- 注意:
scanf("%s", str)读取字符串时,自动以空格/换行分隔,适合本题输入格式
三、命令解析逻辑
1. 字符转整数
int op = cmd[0] - '0'; // 命令第1位:0=翻转,1=替换
int start = cmd[1] - '0'; // 命令第2位:操作起始下标
int len = cmd[2] - '0'; // 命令第3位:操作长度
- 原理:字符 ‘0’-‘9’ 的ASCII码连续,减去 ‘0’ 可转为对应整数
2. 替换内容提取
char *replace_str = cmd + 3; // 命令第4位开始为替换内容
- 本质:指针偏移,
cmd + 3等价于&cmd[3],指向替换字符串起始位置
四、核心操作实现
1. 字符串翻转(双指针法)
int left = start;
int right = start + len - 1;
while (left < right) {
char temp = str[left];
str[left] = str[right];
str[right] = temp;
left++;
right--;
}
- 逻辑:左右指针向中间移动,交换对应位置字符,直到指针相遇
- 特点:原地翻转,不额外占用空间,时间复杂度 O(len)
2. 字符串替换(支持长度不等)
核心思路:分段拼接,拆分为「前半段 + 替换内容 + 后半段」
char temp[201]; // 临时数组存储拼接结果
// 步骤1:复制原字符串起始下标前的部分
strncpy(temp, str, start);
// 步骤2:拼接替换内容(从start位置开始)
strcpy(temp + start, replace_str);
// 步骤3:拼接原字符串操作结束后的剩余部分
strcpy(temp + start + replace_len, str + start + len);
// 步骤4:覆盖原字符串
strcpy(str, temp);
五、关键字符串函数详解
| 函数 | 原型 | 核心用法 | 注意事项 |
|---|---|---|---|
strncpy | char *strncpy(dest, src, n) | 复制src的前n个字符到dest | 1. 不自动补\0(src长度≥n时);2. 需保证dest空间足够 |
strcpy | char *strcpy(dest, src) | 复制src完整字符串(含\0)到dest | 1. 自动覆盖原有内容;2. 必须保证dest空间≥src长度 |
strlen | size_t strlen(str) | 计算字符串长度(不含\0) | 仅统计有效字符,终止符\0不计入 |
六、易错点与避坑指南
- 数组长度预留:必须定义足够大的数组(如201),避免替换后字符串变长导致内存溢出
- 指针偏移计算:
temp + start + replace_len需准确,否则拼接位置错误 - 字符转整数:命令解析时必须减 ‘0’,否则得到的是ASCII码而非实际数字
- 多组输入循环:
while (scanf("%s", str) != EOF)是处理多组数据的标准写法
七、核心逻辑总结
- 多组输入通过
scanf循环读取,直到EOF结束; - 命令解析核心是字符转整数 + 指针偏移提取替换内容;
- 翻转用双指针原地交换,替换用三段拼接支持长度不等;
- 字符串操作函数需区分
strncpy(限长复制)和strcpy(完整复制)的使用场景。完整代码知识点笔记
一、核心头文件与变量定义
1. 必备头文件
#include <stdio.h> // 输入输出函数(scanf/printf)
#include <string.h> // 字符串操作函数(strncpy/strcpy/strlen)
2. 变量定义要点
char str[201];:定义足够大的字符数组(原字符串≤100,预留翻倍空间避免替换后溢出)char cmd[201];:存储命令字符串,需兼容替换内容的长度int n;:记录命令条数;op/start/len:解析命令的操作类型、起始下标、操作长度
二、多组输入处理
1. 核心写法
while (scanf("%s", str) != EOF) { ... }
- 功能:循环读取字符串,直到输入结束(支持多组数据输入)
- 注意:
scanf("%s", str)读取字符串时,自动以空格/换行分隔,适合本题输入格式
三、命令解析逻辑
1. 字符转整数
int op = cmd[0] - '0'; // 命令第1位:0=翻转,1=替换
int start = cmd[1] - '0'; // 命令第2位:操作起始下标
int len = cmd[2] - '0'; // 命令第3位:操作长度
- 原理:字符 ‘0’-‘9’ 的ASCII码连续,减去 ‘0’ 可转为对应整数
2. 替换内容提取
char *replace_str = cmd + 3; // 命令第4位开始为替换内容
- 本质:指针偏移,
cmd + 3等价于&cmd[3],指向替换字符串起始位置
四、核心操作实现
1. 字符串翻转(双指针法)
int left = start;
int right = start + len - 1;
while (left < right) {
char temp = str[left];
str[left] = str[right];
str[right] = temp;
left++;
right--;
}
- 逻辑:左右指针向中间移动,交换对应位置字符,直到指针相遇
- 特点:原地翻转,不额外占用空间,时间复杂度 O(len)
2. 字符串替换(支持长度不等)
核心思路:分段拼接,拆分为「前半段 + 替换内容 + 后半段」
char temp[201]; // 临时数组存储拼接结果
// 步骤1:复制原字符串起始下标前的部分
strncpy(temp, str, start);
// 步骤2:拼接替换内容(从start位置开始)
strcpy(temp + start, replace_str);
// 步骤3:拼接原字符串操作结束后的剩余部分
strcpy(temp + start + replace_len, str + start + len);
// 步骤4:覆盖原字符串
strcpy(str, temp);
五、关键字符串函数详解
| 函数 | 原型 | 核心用法 | 注意事项 |
|---|---|---|---|
strncpy | char *strncpy(dest, src, n) | 复制src的前n个字符到dest | 1. 不自动补\0(src长度≥n时);2. 需保证dest空间足够 |
strcpy | char *strcpy(dest, src) | 复制src完整字符串(含\0)到dest | 1. 自动覆盖原有内容;2. 必须保证dest空间≥src长度 |
strlen | size_t strlen(str) | 计算字符串长度(不含\0) | 仅统计有效字符,终止符\0不计入 |
六、易错点与避坑指南
- 数组长度预留:必须定义足够大的数组(如201),避免替换后字符串变长导致内存溢出
- 指针偏移计算:
temp + start + replace_len需准确,否则拼接位置错误 - 字符转整数:命令解析时必须减 ‘0’,否则得到的是ASCII码而非实际数字
- 多组输入循环:
while (scanf("%s", str) != EOF)是处理多组数据的标准写法
七、核心逻辑总结
- 多组输入通过
scanf循环读取,直到EOF结束; - 命令解析核心是字符转整数 + 指针偏移提取替换内容;
- 翻转用双指针原地交换,替换用三段拼接支持长度不等;
- 字符串操作函数需区分
strncpy(限长复制)和strcpy(完整复制)的使用场景。
更多推荐

所有评论(0)