从一维数组中删除多个匹配项

时间:2015-02-19 12:18:34

标签: c++ arrays function

我编写了一个函数,可以从一维数组中删除多次出现的字母。但是如果有两个相同的字母一个接一个地在while循环中,而错过第二个字母作为索引则增加到数组的下一个位置。

void removeAllOccurrences(char text[], char letter)
{
    int index(0);
    while (text[index] != EOT)
    {
        if ((text[index] == letter) || (text[index] == toupper(letter)))
        {
            text[index] = text[index + 1];          
        }
        ++index;
    }
}

如果数组存储单词[a] [b] [c] [c] [EOT],我想删除字母c。 输出将是abcEOT但我希望删除所有出现的c。所以输出应该是abEOT。

4 个答案:

答案 0 :(得分:1)

你可以用两个索引来做。 第一个迭代你的数组,第二个指向存储char的位置。

如果不应删除当前的char,则只增加第二个索引。

void removeAllOccurrences(char text[], char letter)
{
    int index(0);
    int indexOut(0);
    while (text[index] != EOT)
    {
        if ((text[index] != letter) && (text[index] != toupper(letter)))
        {
            text[indexOut] = text[index];
            ++indexOut;
        }
        ++index;
    }
    // we want to keep EOT ?
    text[indexOut] = EOT;
}

答案 1 :(得分:0)

我从其他出现时就知道这个问题,例如尝试从集合中删除对象时:

我倒退了! : - )

==>从text.GetUpperBound(0)开始,将索引减1,直到为0。

答案 2 :(得分:0)

您可以使用std::remove_if

void removeAllOccurrences(char text[], char letter)
{
    auto it = std::remove_if(text, text + strlen(text), [letter](char c)
        { return toupper(c) == toupper(letter) ;});
    *it = '\0';
}

Live example

答案 3 :(得分:0)

你可以做的一种方法是创建第二个字符数组来存储非字母的值,你需要另一个索引,当你找到一个不等于字母的valua时你只需要递增。当你完成最后一个数组时,你可以将它与原始数组相等,如果这就是你想要的。

 void removeAllOccurrences(char text[], char letter){
     int index=0;
     int indexOut=0;
     char newText[sizeof(text)];
     while (text[index] != EOT){
           if ((text[index] != letter) && (text[index] != toupper(letter)))
           {
                newText[indexOut] = text[index];
                ++indexOut;
           }
           index++;
     }
     text = newText;

     cout << "Final: ";
     for (int i=0; i <= sizeof(text) ;++i){
          cout << text[i]<<",";
     }
 }