webentwicklung-frage-antwort-db.com.de

So entfernen Sie alle Vorkommen eines Zeichens in einer c ++ - Zeichenfolge

Ich benutze folgende:

replace (str1.begin(), str1.end(), 'a' , '')

Dies führt jedoch zu einem Kompilierungsfehler.

85
Devesh Agrawal

Grundsätzlich ersetzt replace ein Zeichen durch ein anderes und '' ist kein Zeichen. Was Sie suchen, ist erase.

Siehe diese Frage die das gleiche Problem beantwortet. In deinem Fall:

#include <algorithm>
str.erase(std::remove(str.begin(), str.end(), 'a'), str.end());

Oder verwenden Sie boost, wenn dies für Sie eine Option ist, wie:

#include <boost/algorithm/string.hpp>
boost::erase_all(str, "a");

All dies ist gut dokumentiert auf ReferenzWebsites . Aber wenn Sie diese Funktionen nicht kennen, können Sie diese Dinge leicht von Hand tun:

std::string output;
output.reserve(str.size()); // optional, avoids buffer reallocations in the loop
for(size_t i = 0; i < str.size(); ++i)
  if(str[i] != 'a') output += str[i];
147
Antoine

Der Algorithmus std::replace arbeitet pro Element an einer bestimmten Sequenz (also ersetzt es Elemente durch andere Elemente und kann es nicht durch nichts) ersetzen. Aber es gibt kein leer Zeichen. Wenn Sie Elemente aus einer Sequenz entfernen möchten, müssen die folgenden Elemente verschoben werden und std::replace funktioniert nicht so.

Sie können versuchen, std::remove ( zusammen mit std::erase ) um dies zu erreichen.

str.erase(std::remove(str.begin(), str.end(), 'a'), str.end());
8
leemes

Mit copy_if:

#include <string>
#include <iostream>
#include <algorithm>
int main() {
    std::string s1 = "a1a2b3c4a5";
    char s2[256];
    std::copy_if(s1.begin(), s1.end(), s2, [](char c){return c!='a';});
    std::cout << s2 << std::endl;
    return 0;
}
4
perreal
string RemoveChar(string str, char c) 
{
   string result;
   for (size_t i = 0; i < str.size(); i++) 
   {
          char currentChar = str[i];
          if (currentChar != c)
              result += currentChar;
   }
       return result;
}

So habe ich es gemacht.

Oder Sie könnten wie Antoine erwähnt tun:

Siehe diese Frage die das gleiche Problem beantwortet. In deinem Fall:

#include <algorithm>
str.erase(std::remove(str.begin(), str.end(), 'a'), str.end());
3
Rafael Valle

Falls Sie ein predicate und/oder ein nicht leeres output haben, um es mit der gefilterten Zeichenfolge zu füllen, würde ich Folgendes in Betracht ziehen:

output.reserve(str.size() + output.size());  
std::copy_if(str.cbegin(), 
             str.cend(), 
             std::back_inserter(output), 
             predicate});

In der ursprünglichen Frage ist das Prädikat [](char c){return c != 'a';}

1
jimifiki

Dieser Code beseitigt die Wiederholung von Zeichen, d. H. Wenn die Eingabe aaabbcc ist, ist die Ausgabe abc.

cin >> s;
ans = "";
ans += s[0];
for(int i = 1;i < s.length();++i)
if(s[i] != s[i-1])
    ans += s[i];
cout << ans << endl;
1
shivakrishna9