我正在尝试从动态数组中仅消除元音。 有了这个功能,我只会得到这样的空格。
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;
}
}
答案 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"
...