有memcpy的问题

时间:2013-02-11 06:45:00

标签: 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; 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。

2 个答案:

答案 0 :(得分:3)

好的,您的代码存在一些问题。

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

其次:使用memcopy替换某些内容只有在替换长度与要替换的部分长度相同时才有效。请考虑以下示例:

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

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

请注意,'foo'的第二个'o'缺失。这是因为您只复制目标字符串所包含的字节数。如果你要复制替换所用的字节数,那么你最终会得到一个像Thfoois a test这样的字符串。不是很好吗?

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

答案 1 :(得分:1)

memcpy函数不适用于一个字符串替换为另一个字符串,只有当两个字符串具有相同的长度时才能正常工作,并且它不会取代多次出现。你需要像str_replace这样的工作来完成这项工作。