繁体   English   中英

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

[英]How do I replace all occurrences in an array with another array in C

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

我有一个代码:将字符串存储在要进行替换的数组中output[] ,将要搜索的字符串存储为replace[]另一个数组,以及称为toBeReplacedBy的第三个数组,并替换第一个出现的效果很好,但是它会跳过output的其他出现

例如:

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来执行此操作

提前准备

永远不要迭代超过数组的长度。 这导致不确定的行为,甚至可能是危险的行为。 如果只希望使用字符串,请使用类似以下的内容:

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++;
}

但是请检查数组边界。

编辑:另外,如Nellie所述,使用调试器将帮助您了解发生了什么问题。 逐步检查您的程序,并查看值的更改方式和时间。

首要建议是尝试调试您的程序,如果它不起作用。

for (i = 0; i<80; i++) {
        if (output[i] == replace[i])
            output[i] = toBeReplacedBy[i];
    }

此循环中有两个问题。

第一个是迭代直到i为80。让我们看看当i变为3时会发生什么。在abcdefabcd的情况下, output[3]是什么,但是replace[3]什么呢? 您的替换数组只有3个字母,因此一旦在原始字符串中出现一次替换数组,您就必须返回替换数组。

第二个是您逐字母检查。

假设您的原始数组的output命名为abkdefabc ,前三个字母与替换字符串不匹配,但是您将检查前两个字母是否与替换字符串的前两个字母匹配,并且您将错误地更改它们。

因此,您需要首先检查整个替换字符串是否存在,然后再替换。

您应该使用strlen()知道数组的长度,或者迭代直到到达数组的末尾('\\ 0')。

'\\ 0'和strlen仅可用于char数组。

您的循环应如下所示:

int i = 0;
int len = strlen(my_string);
while (i < len)
{
  //logic here
  i = i + 1;
}

要么

int i = 0;
while (my_string[i] != '\0')
{
  // logic here
  i = i + 1;
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM