memcpy有问题吗

memcpy有问题吗,c,memcpy,c-strings,C,Memcpy,C Strings,我正在使用的代码: 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; wC

我正在使用的代码:

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
例如,我的程序有一个目标字符串“h” 例如,它还有一个替换字符串“j”

每次它看到“h”时,都应该用“j”替换它


生日快乐应该是jappy birtjday。

该函数不用于将一个字符串替换为另一个字符串,仅当两个字符串的长度相同时,该函数才能正常工作,并且不会替换多个字符串。你需要一些类似的东西来完成这项工作。

好的,你的代码有几个问题


首先:strstr只返回指向要匹配的序列的第一次出现的指针。有关详细信息,请参阅。因此,您永远不会得到指向第二次或第三次事件的指针。你需要在这里重新设计你的概念

第二:只有当替换件的长度与要替换的零件的长度相同时,使用memcopy替换某些零件才有效。考虑下面的例子:

Address:  0123456789ABCD
Original: This is a test
Target: is
Replacement foo
请注意,替换超出了目标的长度。现在代码中发生了什么?strstr返回地址2。现在将此指针传递给memcpy。您得到的是以下字符串:Thfo是一个测试

请注意,“foo”的第二个“o”已丢失。这是因为复制的字节数与目标字符串的字节数相同。如果您复制的字节数与替换的字节数一样多,那么您将得到一个类似Thfoois-a-test的字符串。好不了多少,不是吗


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

也许您真的应该提供更多细节。比如说,你为什么要考虑“Jabpy BurtjDay'”和“ZeoRox”的正确替换,你是否反复调用STRSTR?如果是,请告诉我们您使用的循环。对不起,我认为这是不言自明的。补充说明。我还将添加到循环中。谢谢你认为你没有发布的坏代码中的bug是不言自明的?极有吸引力的现在您已经发布了代码:没有任何东西可以在文本中进行多次替换,因此它不可能实现您期望的功能。。。我希望这是不言自明的。我是在谈论这个计划的想法…非常感谢你的解释。这完全有道理。strstrstr只返回指向要匹配的序列的第一次出现的指针。有关详细信息,请参见此处。-OP显然每个单词只需要一个替换词。我认为每个字都有一个循环,但它不需要初始化像wCounter、numofords或temp这样的变量。。。不管是什么原因。你完全错了——关于什么?正如我所说,这是一个字一个替换。而不是咆哮-对不起?它会得到一个标志。每次它看到目标字符串时,它都会用我的替换字符串替换它。可能是快乐的生日,那就相当于JJJJJAPPY birtjday。说明中有说明。再次感谢Junix提供了不同的方法。哦,是的,我犯了一个错误。我向吉姆道歉。应该是zzerozz。
Address:  0123456789ABCD
Original: This is a test
Target: is
Replacement foo