我想用另一个数组替换数组(字符串)中的所有匹配项。
我有一个代码:
将字符串存储在要进行替换的output[]
数组中,
另一个将要搜索的字符串存储为replace[]
的数组和一个名为toBeReplacedBy
的第三个数组,并且替换第一个匹配项可以正常工作,但是它会跳过output
中的其他匹配项< / p>
例如:
replace[]:
abc
toBeReplacedBy[]:
xyz
output[]:
abcdefabc
becomes
xyzdefabc
but it should become:
xyzdefxyz
我怀疑问题在于替换代码:
//the replacer
for (i = 0; i<80; i++) {
if (output[i] == replace[i])
output[i] = toBeReplacedBy[i];
}
//debug purpose
puts("output[]:\n");
puts(output);
return 0;
}
我在这里做错了什么,如何替换数组中所有出现的错误。
请注意,我只希望使用stdio.h
来完成
提前致敬
答案 0 :(得分:2)
永远不要迭代超过数组的长度。这导致不确定的行为,甚至可能是危险的行为。如果只希望使用字符串,请使用类似以下内容的
int i = 0;
while(output[i] != '\0')
{
// your logic here
i++;
}
此外,您还要检查相同字符的同时出现。但是在您的代码中,您仅检查前三个字符。此后的一切都是不确定的行为,因为您不知道replace[3]
返回什么。
类似的事情可能起作用:
int i = 0;
int j = 0;
int k;
while(output[i] != '\0')
{
if (output[i] == replace[j])
j++;
else
j = 0;
// replace 3 with the array length of the replace[] array
if (j == 3)
{
for(k = i; j >= 0; k-- )
{
output[k] = toBeReplacedBy[j]
j--
}
j = 0;
}
i++;
}
但是请检查数组边界。
edit:另外,如Nellie所述,使用调试器将帮助您了解发生了什么问题。逐步查看程序,并查看值的更改方式和时间。
答案 1 :(得分:0)
第一个建议是,如果程序不起作用,请尝试对其进行调试。
for (i = 0; i<80; i++) {
if (output[i] == replace[i])
output[i] = toBeReplacedBy[i];
}
此循环中有两个问题。
第一个是迭代直到i
为80。让我们看看当i
变为3时会发生什么。output[3]
在 abcdefabc 为 d ,但是replace[3]
是什么?您的替换数组只有3个字母,因此一旦在原始字符串中出现一次替换数组,您就必须返回替换数组。
第二个是您逐字母检查。
假设您的原始数组命名为output
是 abkdefabc ,前三个字母与替换字符串不匹配,但是您将检查前两个字母是否与替换字符串匹配替换的前两个字母,您会错误地更改它们。
因此,您需要首先检查整个替换字符串是否存在,然后再替换。
答案 2 :(得分:0)
您应该使用strlen()知道数组的长度或迭代直到到达数组的末尾('\ 0')。
'\ 0'和strlen仅适用于char数组。
您的循环应如下所示:
int i = 0;
int len = strlen(my_string);
while (i < len)
{
//logic here
i = i + 1;
}
OR
int i = 0;
while (my_string[i] != '\0')
{
// logic here
i = i + 1;
}