我正在使用的代码:
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。
答案 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这样的工作来完成这项工作。