用新字符串替换String模式

时间:2014-03-25 01:18:30

标签: c string design-patterns replace

我真的可以帮助解决这个问题......

  • char *replace(char *s, char *pat, char *rep)

    返回字符串s的副本,但每个pat实例都替换为rep。请注意,len(pat)可以小于,大于或等于len(rep)。该函数为结果字符串分配内存,由调用者释放它。例如,如果我们调用replace("Fiore X", "X", "sucks"),则返回的是新字符串Fiore sucks(但请记住,pat可能比单个字符长,并且可能多次出现。)

我设法确定模式是否出现在原始字符串中,但如果模式出现多次,我会遇到问题。我还没有完成使用替换文本创建新字符串的部分。我不允许使用<string.h>中的任何功能。 (我对C来说还很新)

char *replace(char *s, char *pat, char *rep){

    char *a = malloc(300);
    char *pa = s;
    int patLen = 0;
    int i;

    for(i = 0; pat[i] != '\0'; i++)
    {
        patLen++;
    } 
    int ogLen = patLen;
    while(*s != '\0')
    {
        if(*s == *pat)
        {
            s++;
            pat++; 
            patLen--;
            while(*s == *pat)
            {
                s++;
                pat++;
                patLen--;
            }
            if(patLen == 0)
            {
                printf("This is a pattern");
                patLen = ogLen;
            }
        }
        s++;

    }   
    return s;
}

2 个答案:

答案 0 :(得分:3)

由于你不能使用string.h函数,我会写一些字符串实用程序函数来计算字符串长度,比较字符串和复制字符串。这将使您的代码更容易理解。我将通过字符串s进行2次传递:第一次将计算pat的发生次数。然后我可以计算新字符串的大小:length(s)+ occurrence *(length(rep) - length(pat)。分配新字符串。现在再次通过字符串s,复制到新字符串但是每当发生pat找到,复制代表。希望这有帮助。

答案 1 :(得分:2)

好的,不使用string.h,就可以完成。

首先,你正在做pat ++,但永远不会回头。在找到pat字符串的第一个字母后,你永远不会回到字符串的开头进行其他比较。

使用s ++很好,因为你不需要回到这个字符串的开头,但是对于pat,我会建议你使用索引,并评估pat [i]。尽管如此,如果你跟踪使用pat ++进行多少次攻击,你应该能够准确地计算(顺便说一下,递归将是一种优雅的方式,而不创建一个int来跟踪多少你提前的时间)

第二次,为了安全起见,我会包括&amp;&amp; * s!=&#39; \ 0&#39;。出于原因,添加&amp;&amp; patLen!= 0。如果你不包括最后一个,你将做一个额外的s ++,并失去一个可能的起点。

最后,只要一个printf不能解决您的问题,您应该能够跟踪找到模式的位置(通过一系列整数轻松完成),这样您就可以返回并替换它。

当pat和rep有不同的大小时,替换会变成技巧。我会创建一些额外的函数,为chars腾出空间(如果是rep&gt; pat),并消除一些字符(如果rep