gpt4 book ai didi

c - 从字符串中搜索和删除子字符串

转载 作者:太空宇宙 更新时间:2023-11-04 03:35:54 24 4
gpt4 key购买 nike

我想删除一个字符串的所有实例(小于或等于)另一个字符串。即使是重叠的子字符串也应该完全删除。这是我写的代码:

#include<stdio.h>

int Checknremove(char *str,char *ph)
{
while( *str )
{
char *k=ph,*s=str;
while( *k && *k==*s ) ++k,++s;
if( !*k )
{
while( *s ) *str++=*s++;
*str=0;
return 1;
}
++str;
}
return 0;
}

int main()
{
int t;
scanf("%d", &t);
while(t--)
{
char str[100], ph[100];
scanf("%s %s", str, ph);
while(Checknremove(str,ph));
puts(str);
}
return 0;
}

问题是它只删除了不同的子字符串而不是重叠的子字符串。示例:catafjkgjcat 猫 将输出 afjkgj 但 aababbaababbac aababba 将输出 ababbac 而不是我想要的 c。我该怎么办?

最佳答案

aababbaababbac 有两个 aababba,但它们是重叠的。

您应该先标记要删除的位置,然后再删除标记的字符,而不是立即删除您找到的字符。

更新:这是一个示例实现。

#include<stdio.h>
#include<stdlib.h> /* for using malloc */
#include<string.h> /* for using strlen and strncmp */

/* add const since it won't be modified */
/* made the return value void since this will remove all target by one call */
void Checknremove(char *str,const char *ph)
{
size_t srclen = strlen(str);
size_t targetlen = strlen(ph);
char *delete_flag = calloc(srclen, 1);
size_t i, j;
if(delete_flag == NULL) exit(1); /* failed to allocate the memory */
/* search the target and mark it */
for(i = 0; i <= srclen - targetlen; i++)
{
if(strncmp(str + i, ph, targetlen) == 0)
{
for (j = 0; j < targetlen; j++) delete_flag[i + j] = 1;
}
}
/* copy undeleted characters to str */
for (i = j = 0; i < srclen; i++)
{
if (!delete_flag[i]) str[j++] = str[i];
}
str[j] = '\0';
free(delete_flag);
}

int main()
{
int t;
scanf("%d", &t);
while(t--)
{
char str[100], ph[100];
scanf("%s %s", str, ph);
Checknremove(str,ph);
puts(str);
}
return 0;
}

关于c - 从字符串中搜索和删除子字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32808504/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com