关于字符数组中删除某个字符,删除多个字符,删除某个字符串的问题
这几个问题困扰了我好多天,费了我很多心血,话不多说,下面给大家分享我的总结:
字符串中删除某个字符
我学习了很多种方法,总结了一种比较简便的方法,如下图:
输入样例:
flagflag
a
输出样例:
flgflg
#include<stdio.h>
#include<string.h>
//删除一个字符串中的指定字符
void delate(char x[], char y)
{
int i = 0,j = 0,t = 0, len = strlen(x);
for (i = 0; i < len; i++)
{
if (x[i] == y)//如果某一项等于要删除的那一项,
{
for (j = i; j < len+1; j++)//把之后的所有项依次往前一个
{ //最后一项是把"/0"往前一位
t = x[j];
x[j] = x[j + 1];
x[j + 1] = t;
}
}
}
puts(x);
}
int main(void)
{
char a[20], b;
gets_s(a);
scanf("%c", &b);/*输入字符串和要删除的字符*/
delate(a, b);/*调用函数*/
return 0;
}
这是一个普通的调用函数的写法,我尝试着用指针?写一下。
#include<stdio.h>
#include<string.h>
void delate(char* x, char y)
{
int i = 0, j = 0, t = 0, len = strlen(x);
for (i = 0; i < len; i++)
{
if (*(x + i) == y)
{
for (j = i; j < len + 1; j++)
{
t = *(x + j);
*(x + j) = *(x + j + 1);
*(x + j + 1) = t;
}
}
}
puts(x);
}
int main(void)
{
char a[20], b;
gets_s(a);
scanf("%c", &b);
char* p = a;
delate(p, b);
}
OK,成功,大差不差,思路一样,只是写法不一样。
字符串中删除某个子串
毫无头绪,我参考了下面博主的文章,大家可以点击链接跳转,里面有比较详细的解释
https://blog.csdn.net/u011779517/article/details/103366593
输入样例:
flaagglf
ag
输出样例:
fllf
#include<stdio.h>
#include<string.h>
int main(void)
{
char str1[100], str2[100];
gets_s(str1);
gets_s(str2);
int len1 = strlen(str1);
int len2 = strlen(str2);
int i, j, k;
int flag = 1;//flag控制while循环,判断是否重复寻找要删除的子串
int f;
while(flag)
{
for (i = 0; i < len1; i++)
{
flag = 0;//假设没有找到要删除的子串结束循环
if (str1[i] == str2[0])
{
f = 1;//默认从第i个字符开始的字符串符号要求
for (j = i, k = 0; k < len2; j++, k++)//如果不符合要求,则f=0,循环停止
{
if (str1[j] != str2[k])
{
f = 0;
break;
}
}
if (f)//如果符号要求,则执行删除子串操作
{
flag = 1;
for (; j < len1; i++, j++)//省略的部分:就是j=i+要删除子串的长度
{
str1[i] = str1[j];//相当于字符串abcdefgh要删除cde,然后把c替换为f,d替换为g,e替换为h
}
for (; i < len1; i++)
{
str1[i] = '\0';//由上面例子替换之后abfgh,然后把后面的都赋值为\0
}
break;//返回开始,重新寻找
}
}
}
len1=strlen(str1);//重新计算字符串的长度
}
puts(str1);
return 0;
}
字符串中删除多个字符
原理和删除单个字符一样,只不过把删除单个字符的函数重复执行。
我练习了一个删除俩个字符的函数:
输入样例:
agdagdagd
ag
输出样例:
ddd
#include<stdio.h>
#include<string.h>
//删除一个字符串中的俩个指定字符
void delate2(char x[], char q)
{
int i = 0, j = 0, t = 0, len = strlen(x);
for (i = 0; i < len; i++)
{
if (x[i] == q)//如果某一项等于要删除的那一项,
{
for (j = i; j < len + 1; j++)//把之后的所有项依次往前一个
{ //最后一项是把"/0"往前一位
t = x[j];
x[j] = x[j + 1];
x[j + 1] = t;
}
}
}
}
void delate1(char x[], char y,char z)
{
delate2(x, z);
int i = 0,j = 0,t = 0, len = strlen(x);
for (i = 0; i < len; i++)
{
if (x[i] == y)//如果某一项等于要删除的那一项,
{
for (j = i; j < len+1; j++)//把之后的所有项依次往前一个
{ //最后一项是把"/0"往前一位
t = x[j];
x[j] = x[j + 1];
x[j + 1] = t;
}
}
}
puts(x);
}
int main(void)
{
char a[20], b,c;
gets_s(a);
scanf("%c%c", &b,&c);/*输入字符串和要删除的字符*/
delate1(a, b,c);/*调用函数*/
return 0;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 终于写完轮子一部分:tcp代理 了,记录一下
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理