(篇八)C语言在母串删子串、输入位置截取子串


本篇主要介绍C语言字符串中的相关操作,然后分析两个C语言实例——在母串中指定删除子串、在母串中截取子串

一、字符串

了解C 语言的都知道,C语言中没有字符串类型,所以C语言是用字符串常量、字符指针、字符数组来表示字符串。这些字符串都是以 NULL、’\0’或者ASCII==0来结尾。说白了就是一个个字符组成一串有序序列,就是C语言中的字符串了。
1、字符串常量:
字符串常量是不可被修改的,它的定义方法是这样的:

#define N "hello"

用一对双引号(" ")括起的一串字符来表示字符串常量,如上面的"hello"

2、字符指针表示字符串:

char *message = "Hello World!";

遍历字符指针

while(*message != '\0'){
    printf("%c ",*message++);
  }

3、字符数组:
字符串还可以存储于字符数组或动态分配的内存中。定义一个字符数组和定义一个普通数组一样,不同的是字符数组中存放的是字符数据而已
定义字符数组

char charArray[] = "Hello World!";    // 声明并初始化一个字符数组

遍历字符数组

for(i = 0; i < len; i++)
{
    if( str[i] <= 'z' && str[i] >= 'a')
	{
        str[i] = str[i] - 32;
   }
}

以上都C语言字符串的基本概念,下面分享两个实例

二、删除指定的字符

1、分析:
(1)我们需要写一个函数来删除指定的字符串,所以重点就在这个函数上;
(2)在函数中,需要用一个循环来遍历母串中的所有字符,循环中将遍历到的字符与输入的字符进行比较;
(3)如果找到了就删除它,其实就是将后续的字符往前覆盖
(4)核心算法:

while(str[i] != '\0')
	{
		if(str[i] == c)				//找到需要删除的字符了 
		{
			for(j=i; str[j]!='\0'; j++)	
			{
				str[j]= str[j+1];		//从该字符被覆盖后,后续字符依次往前覆盖 
			}
		}
		else 
			i++;
	}

2、参考结果:
删除字符
3、参考代码:

#include <stdio.h>
void CharDelete(char *str, char c);

void main()
{
	char s[100];
	char c;
	printf("请输入一个字符串:");
	gets(s);
	printf("请输入需要删除的字符:");
	c= getchar();
	CharDelete(s, c);
	printf("删除后的字符串为:%s",s);
} 

void CharDelete(char *str, char c)
{
	int i=0, j;
	while(str[i] != '\0')
	{
		if(str[i] == c)				//找到需要删除的字符了 
		{
			for(j=i; str[j]!='\0'; j++)	
			{
				str[j]= str[j+1];		//从该字符被覆盖后,后续字符依次往前覆盖 
			}
		}
		else 
			i++;
	}
}
三、从母串中截取子串

1、分析:
(1)需要用一个循环来遍历母串中的所有字符,然后用子串的第一个字符与母串中遍历的每一个字符进行比较;
(2)如果相同的话,就开始遍历子串,同时外部循环又在遍历母串,这样就能动态将母串与子串的各个字符对应比较;
(3)如果在遍历子串中,有一个字符不相等,就跳出遍历;
(4)如果将子串全部遍历完了,说明母串中的这一段,就是与子串完全相同的,这样就可以进行删除操作了;
(5)所谓删除,就是将不需要删的部分存入一个新的字符串,所以需要提前定义一个新的字符数组或者字符指针

2、参考结果:
母串删子串

3、参考代码:

#include <stdio.h>
#include <string.h>

main()
{
	int i,j=0,k,n2;
	char strings[100],s[20],new[100];  //子串s,母串strings, 新串new 
	printf("输入母串:\n");
	gets(strings);
	printf("输入要删除的子串:\n");
	gets(s);
	
	k=0;
	n2=strlen(s);  //记录子串的长度 
	
	//遍历母串,然后在母串种遍历子串 
	for(i=0,k=0;strings[i];i++)
	{
		if(strings[i]==s[0])
		{
			while(s[j])
			{
				if(s[j++]!=strings[i++])  //将子串遍历一遍 
				{
					break;  //一旦有个字符不同就跳出对子串的遍历 
				}
			}
			//如果子串全部遍历完了,那就说明子串的这部分不需要存在,
			//直接将母串的后续字符加到新串中 ,并且回到对母串的遍历中 
			if(j==strlen(s))
			{
				new[k++] = strings[i];
				continue;
			}
				
		}
		new[k++] = strings[i];  //正常情况就直接将每个字符都存到新串里 
	}
	puts(new);
}
四、输入位置截取子串

1、分析:
(1)先用变量标记好用户输入的位置;
(2)然后从开始截取的位置开始往后遍历母串

2、参考结果:
截取

3、参考代码:

#include <stdio.h>
#include <string.h>
void SubStr(char *str1, char *str2, int m, int n);		//原始字符串,截取的子串,开始截取的位置,截取个数 

int main()
{
	char s1[100], s2[100];
	int m, n;
	printf("请输入一个字符串:\n");
	gets(s1);
	printf("请输入需要截取的位置:\n");
	scanf("%d",&m);
	m=m-1;		//减 1 为了得到正确的下标 
	printf("请输入截取字符的个数:\n");
	scanf("%d",&n);
	SubStr(s1, s2, m, n);
	printf("截取的子串为:\n%s",s2);
} 

void SubStr(char *str1, char *str2, int m, int n)
{
	int i;
	if(strlen(str1) <m)
	{
		str2[0]= '\0';		//子串大于原始字符串,则直接结束(封装)
		return;				//无值返回主函数 
	}
	for(i=m; (i<m+n)&&(str1[i]!='\0'); i++)			//从开始截取的位置开始往后遍历 
	{
		str2[i-m]= str1[i];
	}
	str2[i-m]= '\0';
}
  • 4
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

鸿蒙Next

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值