C语言实现字符串中指定位置的插入与删除操作
本文详解C语言中如何通过字符数组移位实现字符串的插入与删除。文章提供了完整的C/C++代码示例,分别演示了在指定位置插入子串的前移扩容逻辑,以及删除指定范围字符的前移覆盖逻辑。
字符串中插入某段字符
第1步:准备环境与变量定义
在C/C++环境中操作字符串,需引入标准库函数。为了安全起见,本例使用 gets_s 而非传统的 gets,以避免缓冲区溢出风险。同时需要定义待操作的字符数组、目标字符串以及控制循环的索引变量。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main() {
// arr为原字符串(被插入对象),str为目标字符串(插入对象)
char arr[50], str[20];
// 定义索引与控制变量
int index, lens, size, lena, j;
// ...后续步骤...
第2步:获取用户输入数据
首先读取原始字符串和目标字符串,然后询问用户希望插入的位置索引。注意清除输入缓冲区中的残留换行符。
// 1. 输入原字符串和目标字符串
gets_s(arr);
printf("输入插入的位置和插入的字符串:");
scanf_s("%d", &index); // 读取插入起始索引
getchar(); // 清除缓冲区
gets_s(str); // 读取要插入的字符串
第3步:计算长度与扩容移位(核心逻辑)
要在指定 index 处插入长度为 lens 的字符串,必须先将 index 之后的所有字符向后移动至少 lens 个单位。为了防止字符碰撞(从前往后复制会覆盖源数据),必须从后往前进行逐位移动。
这里采用的策略是循环执行 size 次单步后移,每次将 index 之后的一个区间整体右移一位。虽然效率不如直接计算偏移量后一次性拷贝,但逻辑直观且易于理解。
lena = strlen(arr); // 原字符串当前长度
lens = strlen(str); // 待插入字符串长度
size = lens; // 总共需要挪动的次数
// 使用辅助索引记录当前移动的参考点
int indexx = index;
for (int i = 0; i < size; i++) {
// 从末尾开始,将 indexx 后的每个字符向后挪一位
for (j = lena; j > indexx; j--) {
arr[j] = arr[j - 1];
}
// 每次挪动后,原字符串有效长度增加,参考点也加一
lena++;
indexx++;
}
第4步:填入目标字符串并输出
移位完成后,index 位置之后已空出 lens 长度的空间。此时只需将目标字符串的内容依次复制到该区间即可,最后别忘了重置字符串结束符 '\0'(如果在插入过程中未正确处理)。在上面的移位逻辑中,我们在循环结束后显式设置了结束符,但在实际插入阶段仍需确保正确写入。
// 移位后,先标记新的结尾(防止内存干扰)
arr[lena] = '\0';
// 将 str 的内容填入空出的区域
int k = 0;
for (int j = index, k=0; j < index + lens; j++, k++) {
arr[j] = str[k];
}
puts(arr);
return 0;
}
完整插入功能代码:
#include <stdio.h>
#include<stdlib.h>
#include <string.h>
int main() {
// 字符串的插入操作
int index, lens, size, lena, j;
char arr[50], str[20]; // arr是被插入的数组,str是插入的数组
gets_s(arr);
printf("输入插入的位置和插入的字符串:");
scanf_s("%d", &index);
getchar(); // 清除缓冲区
gets_s(str);
lena = strlen(arr); // 被插入字符串个数
lens = strlen(str); // 要插入字符串个数
size = lens; // 一共要挪动的size次数
int indexx = index; // 用另一个变量代替index作为移动基准
for (int i = 0; i < size; i++) {
for (j = lena; j > indexx; j--) {
arr[j] = arr[j - 1]; // 前一个位置给后一个赋值
}
lena++; // arr长度要加1
indexx++;
}
arr[lena] = '\0'; // 结束字符串
// 最后插入str
int k = 0;
for (int j = index, k=0; j < index + lens; j++, k++) {
arr[j] = str[k];
}
puts(arr);
return 0;
}
字符串删除某段字符
第1步:确定删除范围
删除字符串中从 index 开始、长度为 lens 的子串。核心思想是:将被删除部分后面的所有字符向前移动,覆盖掉被删除的内容。
首先需要验证输入的合法性,确保删除范围不超出字符串总长度。
char arr[50];
gets_s(arr);
int len = strlen(arr); // 原字符串总长度
int index, lens, k, movestar;
printf("输入您要删除的开始位置和字符长度");
scanf_s("%d %d", &index, &lens);
// 边界检查
if (lens + index >= len) { // 优化判断,等于len时视为删除到末尾
printf("删除长度过大或无效!");
return 0;
}
第2步:计算前移量与循环执行
我们需要计算剩余字符的数量(即需要向前挪动的字符总数 res)。如果采用逐层剥离的方式,每删除一个字符,剩余的字符都要向前补位一次。
算法逻辑:
- 外层循环控制需要删除的字符数量(
lens)。 - 内层循环负责将
index之后的每一个字符向前挪动一位(覆盖j-1)。 - 每完成一次前移,都需要重置字符串结束符
'\0',因为最后一个位置的数据已被覆盖或丢弃。
// res表示除了被删除区间的剩余字符数,这里辅助简化逻辑
// 实际上更直接的写法是直接让指针/索引推进
// 按照草稿逻辑:
int res = len - index - lens + 1;
int lenss = lens;
for (int i = 0; i < lenss; i++) {
movestar = index + lens - 1; // 每次从尾部开始找要移动的起点
// 从后往前将 index 后的字符向前移一位
for (int j = movestar, k=0; k
第3步:输出结果验证
当循环结束,被删除的部分已被后面的字符完全覆盖,且字符串长度已修正。打印结果即可看到删除后的效果。
完整删除功能代码:
#include <stdio.h>
#include <stdlib.h>
#include<string.h>
int main() {
int index, lens, k, movestar;
char arr[50];
gets_s(arr);
int len = strlen(arr);
printf("输入您要删除的开始位置和字符长度");
scanf_s("%d %d", &index, &lens);
if (lens + index >= len) {
printf("删除长度过大!");
return 0;
}
int res = len - index - lens + 1; // 辅助计数
int lenss = lens; // 保持原始删除长度用于外层循环
for (int i = 0; i < lenss; i++) {
movestar = index + lens - 1; // 要开始往前挪动字母的所在位置
// 内部逻辑:将 index 后的字符逐个前移
for (int j = movestar, k=0; k
总结
以上介绍了利用基础循环结构在字符数组中手动实现插入与删除的算法。关键点在于理解内存数据的连续性以及通过逆序遍历避免覆盖。以上就是C语言解决字符串中插入和删除某段字符串问题的详细内容,更多关于C语言字符串处理技巧的资料请关注本站其它相关文章!
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













