-3

我正在使用的代码:

char** list  
char** final;
char* target;
char* replace;
int wCounter, cCounter, i, hashCounter = 0, addLetter = 0;
int copyWord, countChars, numOfWords, finalWords = 0, temp;

//stuff here

for(wCounter; wCounter < temp + numOfWords; wCounter++, finalWords++)
{
    printf("Original string: %s\n", list[wCounter+1]);
    final[finalWords] = strstr(list[wCounter+1], target);

    if(final[finalWords] != NULL)
        memcpy(final[finalWords], replace, strlen(target));

    printf("Final string: %s\n\n", final[finalWords]);
}

//stuff here

我的程序输出:

Target string = h   Replacement string = j

Original string: hello
   Final string: jello //works!!!

Original string: happy birthday
   Final string: jappy birthday  // should be jappy birtjday

Target string = ra  Replacement string = ar

Original string: radar
   Final string: ardar   //works!!!

Original string: are you ready
   Final string: (null)  //awkward

Original string: pirate radio rating
   Final string: arte radio rating //should be piarte ardio arting

Target string = x   Replacement string = zz

Original string: exit
   Final string: zit   //should be zzit

Original string: x-ray
   Final string: z-ray  //should be zz-ray

Original string: xerox
   Final string: zerox //should be zzerox

我的程序有一个目标字符串(例如'h')它还有一个替换字符串(例如'j')

每次它看到一个'h'它应该用'j'替换它

生日快乐应该是 jappy birtjday。

4

2 回答 2

3

好的,您的代码有几个问题。

首先: strstr 仅返回指向要匹配的序列的第一个出现的指针(有关详细信息,请参见此处)。所以你永远不会得到指向第二次或第三次出现的指针。你需要在这里修改你的概念。

其次:使用 memcopy 替换某些东西只有在替换的长度与要替换的部分相同的情况下才有效。考虑以下示例:

Address:  0123456789ABCD
Original: This is a test
Target: is
Replacement foo

请注意,替换超出了目标的长度。现在你的代码会发生什么?strstr返回地址 2。您现在将此指针传递给memcpy. 你得到的是以下字符串:Thfo is a test

请注意,缺少“foo”的第二个“o”。这是因为您只复制与目标字符串一样多的字节。如果您复制的字节数与替换的字节数一样多,那么您最终会得到一个类似Thfoois a test. 不是更好吗?

我建议重新考虑您的解决方案概念。也许更好的方法是通过目标字符串的出现来“标记”字符串并连接元素以获得所需的结果。

于 2013-02-11T07:12:22.593 回答
1

memcpy函数不能用另一个字符串替换一个字符串,它只会在两个字符串具有相同长度的情况下按预期工作,并且不会替换多个匹配项。您将需要类似str_replace的东西来完成这项工作。

于 2013-02-11T06:55:55.397 回答