如何删除数组中所有具有元音的元素[C ++]

时间:2019-01-09 05:07:17

标签: c++ arrays

我正在尝试从动态数组中仅消除元音。 有了这个功能,我只会得到这样的空格。

enter image description here

char* eliminarVocales(char* arreglo, int*size)
{
    if (arreglo != nullptr)
    {
        for (int i = 0; i < *size; i++)
        {            
            if (arreglo[i] == 'a' || arreglo[i] == 'e' || arreglo[i] == 'i' || arreglo[i] == 'o' || arreglo[i] == 'u')
            {                
                arreglo[i] = NULL;                
            }                
        }
        return arreglo;
    }
}

2 个答案:

答案 0 :(得分:1)

您的程序未删除元音,而是将其值替换为“ NULL”。因此,在要调用此函数的main函数中。您必须编写另一个函数(例如,显示函数),其中您必须仅显示其中值!= NULL的那些值。

for(i=0;i>maxvalue;i++)
{
  if(arreglo[i] != NULL)
    {
    cout<<"[i]"<<arreglo[i]<<endl;         
    }
}

让我知道它是否对您有帮助。

答案 1 :(得分:0)

由于没有真正从数组中删除任何字符,所以您将获得空白,只是将它们替换为null,然后在输出数组内容时不忽略这些null。

考虑使用标准std::remove_if()算法,而不是手动进行删除,该算法可以将任何元音移动到数组的末尾。并且由于您是通过指针传递数组size的,因此您可以修改其值以指示数组的新大小减去任何移动的元音。

例如:

#include <algorithm>
#include <cctype>

char* eliminarVocales(char* arreglo, int* size)
{
    if (arreglo)
    {
        *size = std::distance(
            arreglo,
            std::remove_if(arreglo, arreglo + *size,
                [](int ch){ ch = std::toupper(ch); return ((ch == 'A') || (ch == 'E') || (ch == 'I') || (ch == 'O') || (ch == 'U')); }
            )
        );
    }
    return arreglo;
}

然后您可以像这样使用它:

void listarElementos(char* arreglo, int size)
{
    for(int i = 0; i < size; ++i)
        std::cout << "[" << i << "] : " << arreglo[i] << std::endl;
}

...

#include <cstring>

int size = 5;
char *arreglo = new char[size];
std::strcpyn(arreglo, "hello", 5);
...
listarElementos(arreglo, size); // shows "hello"
... 
eliminarVocales(arreglo, &size);
...
listarElementos(arreglo, size); // shows "hll"
...
delete[] arreglo;

如果对字符数组使用std::vector(或std::string),则可以使用erase-remove idiom

#include <algorithm>
#include <vector>

void eliminarVocales(std::vector<char> &arreglo)
{
    arreglo.erase(
        std::remove_if(arreglo.begin(), arreglo.end(),
            [](int ch){ ch = std::toupper(ch); return ((ch == 'A') || (ch == 'E') || (ch == 'I') || (ch == 'O') || (ch == 'U')); }
        ),
        arreglo.end()
    );
}

void listarElementos(const std::vector<char> &arreglo)
{
    for(std::size_t i = 0; i < arreglo.size(); ++i)
        std::cout << "[" << i << "] : " << arreglo[i] << std::endl;
}

...

#include <cstring>

std::vector<char> arreglo(5);
std::strcpyn(arr.data(), "hello", 5);
...
listarElementos(arreglo); // shows "hello"
... 
eliminarVocales(arreglo);
...
listarElementos(arreglo); // shows "hll"
...