文章目录


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

一、字符串

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

#define

用一对双引号(" ")括起的一串字符来表示字符串常量,如上面的​​"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、参考结果:

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


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、参考结果:

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

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、参考结果:

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

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';
}