我想删除字符串的所有实例(小于或等于)而不是另一个字符串。甚至应该完全删除重叠的子串。 这是我写的代码:
#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 cat 将输出afjkgj,但aababbaababbac aababba将输出ababbac而不是c,因为我想要它。我该怎么办?
答案 0 :(得分:1)
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;
}
答案 1 :(得分:0)
问题当然是&#34; nremove&#34;。如果您执行删除AS扫描(即立即),重叠部分将不再在str中匹配下一次迭代/调用。
您应该做的是将检查与删除分开:在执行任何删除之前执行所有检查。您必须存储字符串索引或两者之间的通信。