C中的字符串替换

时间:2013-03-16 12:41:50

标签: c string

我正在研究C程序,程序声明如下:

  

给定一个字符串S,以及一个正长度的字符串列表,   F1,R1,F2,R2,...,FN,RN,按顺序查找事件   (从左到右)在S中的Fi并用Ri替换它们。所有字符串都是   超过字母{0,1}。搜索应该只考虑连续   未经事先更换的S件   迭代。算法的迭代不应该覆盖任何   先前由算法替换。

     

输入样本:

     

您的程序应该接受文件名路径作为其第一个参数。   此文件中的每一行都是一个测试用例。每个测试用例都包含一个   字符串,然后是分号,然后是逗号分隔列表   strings.eg。

     

10011011001; 0110,1001,1001,0,10,11

     

输出样本:

     

对于每行输入,在替换后打印出字符串   已经制作成了。

     

11100110

     

示例:10011011001 => 10100111001 [用1001替换0110] =>   10100110 [用0替换1001] => 11100110 [用11代替10] =>   11100110

我的代码能够用Rn替换每个相应的Fn,但它完成了以前的替换。如何只搜索那些未被替换的S连续片段。 我正在进行如下搜索和替换:

  void string_sub(char s1[],char s2[],char s3[])
    {
            char r[200];
            printf("\n%s %s %s\n",s1,s2,s3);
            int i,j,k,x,y;
            char res[100];
            int len1=strlen(s1);
            int len2=strlen(s2);
            int len3=strlen(s3);
            j=0;
            i=0;
            while(i<len1)//searching for string 2 in string 1
            {
                    if(s2[j]==s1[i])
                    {
                            j++;
                            i++;
                            if(j==len2)
                            {
                              y=i;
                              x=i-len2;
                              break;        
                            }
                    }
                    else
                    {
                            if(s2[0]!=s1[i])
                            i++;
                            j=0;
                    }
            }
            k=0;
            for(i=0;i<x;i++)
            {
                    r[k]=s1[i];
                    k++;
            }
            for(i=0;i<len3;i++)
            {
                r[k]=s3[i];
                    k++;
            }
            i=y;
            while(i<len1)
            {
                    r[k]=s1[i];
                    k++;
                    i++;
            }
            r[k]='\0';//resultant string into r
            k=0;
           for(i=0;i<strlen(r);i++)//copying resultant string to s1
           {
            s1[k]=r[i];
            k++;
           }
           s1[k]='\0';
    }

我的整个C代码是here

1 个答案:

答案 0 :(得分:2)

在我看来,如果我正确地理解了你的代码,你就会为你得到的每一对调用替换代码,并且每次传入转换后的字符串。我要做的是将一个起始偏移量传递给该函数,然后让该函数返回你在最后一次替换时留下的新替换字符串中的位置。该函数将开始在偏移处搜索s1而不是每次搜索0。 (如果不执行替换,请记住不要更改偏移量。)因此,在main函数中,有一个偏移量变量从0开始并将其传递给函数,并将函数的结果赋给该变量,下次调用它时,您将从最后一个偏移开始,而不是从开始。这有意义吗?如果不是,我可以尝试更好地解决我的问题。

在你的主要功能中你会:

int offset = 0;

然后

offset = string_sub( offset, s1, s2, s3 );

你的功能看起来像这样:

int string_sub( int offset, char* s1, char* s2, char* s3 )
{
...

并且在您完成替换字符串的位置:

offset = y;

最后你会这样做

return( offset );
}

这有帮助吗?

正如@Mike注意到的,我的回答并不完全正确。我错误地认为你会在你看到的最后一点之前忽略所有内容,因为我没有彻底阅读这些要求。您需要传入一个包含范围数组的结构,而不是传入一个偏移然后返回一个新的偏移量,其中每个范围是一个已被替换的字符范围,并且是不可触及的,以及如何计算该阵列中有许多范围。由于这是在C中,我们没有简单的阵列管理的奢侈,所以我们必须以艰难的方式做到这一点。我会让结构看起来如下:

#define MAX_RANGES (10)

struct RangeEntry
{
    int first;
    int last;
};

struct RangeData
{
    int numRanges;
    struct RangeEntry ranges[MAX_RANGES];
};

然后你的替代函数原型看起来像这样:

int string_sub( char* s1, char* s2, char* s3, struct RangeData* rangeData )

在main函数中,您将实例化此结构,并将numRanges初始化为0,然后将指向此实例的指针传递给您的函数。在你的函数中,你必须以不同的方式看待s1。而不是只是想看看你是否跑掉了字符串的末尾,你必须看看你是否遇到任何这些范围。如果您匹配,则匹配必须在下一个范围的开头结束。如果你不是那么你将不得不继续照顾下一个范围的结束。

我希望这会有所帮助,并为之前的错误答案感到抱歉。