我编写了一个函数,可以从一维数组中删除多次出现的字母。但是如果有两个相同的字母一个接一个地在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。
答案 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';
}
答案 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]<<",";
}
}