字符串翻转/替换操作完整代码知识点笔记

一、核心头文件与变量定义

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);

五、关键字符串函数详解

函数原型核心用法注意事项
strncpychar *strncpy(dest, src, n)复制src的前n个字符到dest1. 不自动补\0(src长度≥n时);2. 需保证dest空间足够
strcpychar *strcpy(dest, src)复制src完整字符串(含\0)到dest1. 自动覆盖原有内容;2. 必须保证dest空间≥src长度
strlensize_t strlen(str)计算字符串长度(不含\0)仅统计有效字符,终止符\0不计入

六、易错点与避坑指南

  1. 数组长度预留:必须定义足够大的数组(如201),避免替换后字符串变长导致内存溢出
  2. 指针偏移计算temp + start + replace_len 需准确,否则拼接位置错误
  3. 字符转整数:命令解析时必须减 ‘0’,否则得到的是ASCII码而非实际数字
  4. 多组输入循环while (scanf("%s", str) != EOF) 是处理多组数据的标准写法

七、核心逻辑总结

  1. 多组输入通过 scanf 循环读取,直到EOF结束;
  2. 命令解析核心是字符转整数 + 指针偏移提取替换内容;
  3. 翻转用双指针原地交换,替换用三段拼接支持长度不等;
  4. 字符串操作函数需区分 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);

五、关键字符串函数详解

函数原型核心用法注意事项
strncpychar *strncpy(dest, src, n)复制src的前n个字符到dest1. 不自动补\0(src长度≥n时);2. 需保证dest空间足够
strcpychar *strcpy(dest, src)复制src完整字符串(含\0)到dest1. 自动覆盖原有内容;2. 必须保证dest空间≥src长度
strlensize_t strlen(str)计算字符串长度(不含\0)仅统计有效字符,终止符\0不计入

六、易错点与避坑指南

  1. 数组长度预留:必须定义足够大的数组(如201),避免替换后字符串变长导致内存溢出
  2. 指针偏移计算temp + start + replace_len 需准确,否则拼接位置错误
  3. 字符转整数:命令解析时必须减 ‘0’,否则得到的是ASCII码而非实际数字
  4. 多组输入循环while (scanf("%s", str) != EOF) 是处理多组数据的标准写法

七、核心逻辑总结

  1. 多组输入通过 scanf 循环读取,直到EOF结束;
  2. 命令解析核心是字符转整数 + 指针偏移提取替换内容;
  3. 翻转用双指针原地交换,替换用三段拼接支持长度不等;
  4. 字符串操作函数需区分 strncpy(限长复制)和 strcpy(完整复制)的使用场景。
Logo

开源鸿蒙跨平台开发社区汇聚开发者与厂商,共建“一次开发,多端部署”的开源生态,致力于降低跨端开发门槛,推动万物智联创新。

更多推荐