如何用C中的另一个数组替换数组中的所有匹配项

时间:2019-04-15 19:18:41

标签: c arrays

我想用另一个数组替换数组(字符串)中的所有匹配项。

我有一个代码: 将字符串存储在要进行替换的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来完成

提前致敬

3 个答案:

答案 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;
}