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

时间:2015-09-27 13:38:21

标签: c string

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

#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,因为我想要它。我该怎么办?

2 个答案:

答案 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中匹配下一次迭代/调用。

您应该做的是将检查与删除分开:在执行任何删除之前执行所有检查。您必须存储字符串索引或两者之间的通信。