C语言解决字符串中插入和删除某段字符串问题

 更新时间:2023年02月06日 09:44:14   作者:正在努力学习的小白袁  
这篇文章主要介绍了C语言解决字符串中插入和删除某段字符串问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

字符串中插入某段字符

核心思想

已知插入字符串的长度len,将插入的位置的后面的字母统统往后移动len个长度。

最后将插入的字符串插入到被插入的字符串。

我们先定义(注意:这里我不考虑极端的情况,如字符串溢出的问题!)

char arr[50],str[20];//arr是被插入的函数,str是插入的函数

我们在确定几个int数

int index, lens, size, lena,j;

其中index是被插入字符串的位置,lens是str的长度,lena是arr的长度,size是arr的index后面要移动lens个长度

接着我们来去这str和arr

	gets_s(arr);
	printf("输入插入的位置和插入的字符串:");
	scanf_s("%d", &index);
	getchar();//清除缓冲区
	gets_s(str);

于是,我们确定长度,在确定要将index后面的所有字母都要挪动size次,才能有足够的空间才存入lens的长度

	lena = strlen(arr);//被 插入字符串个数
	lens = strlen(str);//要插入字符串个数
	size =lens;//一共要挪动的size次数

我们再定义一个变量indexx,作用是辅助作用,等会就懂了

int indexx = index;

最后我们用二层循环

for (int i = 0; i < size; i++) {
		for (j = lena; j > indexx; j--) {
			arr[j] = arr[j - 1];//前一个位置给后一个赋值
		}
		//因已经挪动位置了,故indexx和lena都要加1,才能保证第二个for能循环lena-indexx次
		//因为要挪动的是index后面的字母
		lena++;//arr长度要加1
		indexx++;
	}

末尾放结束语句

arr[lena] = '\0';//结束字符串

最后插入str

//最后给插入str
	int k = 0;
	for (int j = index,k=0; j < index + lens; j++,k++) {
		arr[j] = str[k];
	}
	puts(arr);

完整代码:

#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;
	for (int i = 0; i < size; i++) {
		for (j = lena; j > indexx; j--) {
			arr[j] = arr[j - 1];//前一个位置给后一个赋值
		}
		//以为已经挪动位置了,所以indexx和lena都要加1,才能保证第二次第二个for能循环lena-index次
		//因为要挪动的是index后面的字母
		lena++;
		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;
}

字符串删除某段字符串

核心思想

两层循环,第一层是移动的程度,第二层是移动的字母个数

我们先定义一个字符串 计算他的长度

char arr[50];
	gets_s(arr);
	int len = strlen(arr);

确定:

int index,lens,k,movestar;

其中 index是插入位置,movestar是要被移动的字母的位置,lens是删除的长度

printf("输入您要删除的开始位置和字符长度");
	scanf_s("%d %d", &index, &lens);

如果遇到极端情况,则

if (lens + index  > len) {
		printf("删除长度过大!");
		return 0;
	}

 既然要移动字母,我们肯定得先知道要移动多少个字母,于是定义res

int res = len - index - lens + 1;//要往前挪动的字母个数

res加1使用为我多减掉了1

就不如说我在abcdefg中删除cd,则index就是3,lens就是2,movesatr就是e的位置,res就是efg这三个被移动的字母

要用两层循环

	int lenss = lens;//辅助变量
	for (int i = 0; i < lenss; i++) {
		movestar = index + lens - 1;//要开始往前挪动字母的所在位置
		for (int j = movestar,k=0; k<res; j++,k++) {
			arr[j - 1] = arr[j];
		}
		arr[--len] = '\0';//置零
		lens--;//因为movesatr的位置会改变,所以要-1
	}

来试一下效果:

完整代码: 

#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;//要开始往前挪动字母的所在位置
		for (int j = movestar,k=0; k<res; j++,k++) {
			arr[j - 1] = arr[j];
		}
		arr[--len] = '\0';
		lens--;
	}
	puts(arr);
    return 0;
}

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • C++实现LeetCode(211.添加和查找单词-数据结构设计)

    C++实现LeetCode(211.添加和查找单词-数据结构设计)

    这篇文章主要介绍了C++实现LeetCode(211.添加和查找单词-数据结构设计),本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下
    2021-08-08
  • vscode+qt5+cmake编译调试过程解析

    vscode+qt5+cmake编译调试过程解析

    这篇文章主要介绍了vscode+qt5+cmake编译调试过程解析,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-03-03
  • EasyC++内部链接性和无链接性

    EasyC++内部链接性和无链接性

    这篇文章主要介绍了EasyC++内部链接性和无链接性,当我们使用static关键字,将变量的作用于限制在整个文件时,该变量的链接性为内部链接性,然而无链接性的变量其实就是在代码块当中使用static关键字创建的,接下来一起进入文章了解更多内容吧
    2021-12-12
  • Qt如何实现输入框@联系人的@检测的示例

    Qt如何实现输入框@联系人的@检测的示例

    本文主要介绍了Qt如何实现输入框@联系人的@检测的示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-08-08
  • C语言从基础到进阶全面讲解数组

    C语言从基础到进阶全面讲解数组

    数组是一组有序的数据的集合,数组中元素类型相同,由数组名和下标唯一地确定,数组中数据不仅数据类型相同,而且在计算机内存里连续存放,地址编号最低的存储单元存放数组的起始元素,地址编号最高的存储单元存放数组的最后一个元素
    2022-05-05
  • C++名称空间特性

    C++名称空间特性

    这篇文章主要介绍了C++名称空间特性,文章围绕C++名称空间特性的相关资料展开详细内容,需要的小伙伴可以参考一下下文具体内容,希望对你的学习有所帮助
    2022-01-01
  • C++进一步认识类与对象

    C++进一步认识类与对象

    类是创建对象的模板,一个类可以创建多个对象,每个对象都是类类型的一个变量;创建对象的过程也叫类的实例化。每个对象都是类的一个具体实例(Instance),拥有类的成员变量和成员函数
    2021-10-10
  • 详解C++11 变参模板

    详解C++11 变参模板

    这篇文章主要介绍了C++11 变参模板的相关资料,帮助大家更好的理解和学习c++11,感兴趣的朋友可以了解下
    2020-08-08
  • C语言学生成绩管理系统源代码

    C语言学生成绩管理系统源代码

    这篇文章主要为大家详细介绍了C语言学生成绩管理系统源代码,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-03-03
  • QT中QByteArray与char、int、float之间的互相转化

    QT中QByteArray与char、int、float之间的互相转化

    本文主要介绍了QT中QByteArray与char、int、float之间的互相转化,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-05-05

最新评论