buchstabe entfernen



  • hier gehts darum einen buchstaben aus eine zeichenkette zu entfernen. beim 1. durchlauf passts, beim 2. gehts nicht. komme einfach nicht drauf. bitte um hilfe.

    #include <iostream>
    using namespace std;
    
    int main() {
    
    char eingabe[80]={0} ;
    char ausgabe[80]={0} ;
    char buchstabe;
    
         cout << "Bitte geben Sie eine Zeichenkette ein." << endl;
         cin >> eingabe ;
    
         while (buchstabe!='!') { 
             cout << "Bitte geben Sie einen Buchstaben ein, der eliminiert werden soll." << 
             endl;
             cin >> buchstabe;
    
    	int j=0;
    
           for (int i=0; eingabe[i]!='\0'; i++) {
                if (eingabe[i]!=buchstabe) {  
                ausgabe[j]=eingabe[i]; 
                j++; }
                }
    
                cout << "Resultat: " << ausgabe << endl; 
    
    		for (int i = 0; ausgabe[i]!='\0'; i++) {
    		eingabe[i] = ausgabe[i] ; }
    
                }
                }
    


  • pleease help



  • So etwas gehört nicht ins C++-Forum! Du solltest Strings, Vectoren und die
    Algorithmen der STL benutzen!!!!



  • der grund, warum sich wohl bis jetzt noch niemand geantwortet hat, ist wohl, dass dein code schrecklich zu lesen ist. richtig eingerückt könnte er bspw so aussehen (btw, du hast eine klammer in deinem code zuviel)

    int main()
    {
       char eingabe[80]={0} ;
       char ausgabe[80]={0} ;
       char buchstabe;
    
       cout << "Bitte geben Sie eine Zeichenkette ein." << endl;
       cin >> eingabe ;
    
       while (buchstabe!='!')
       {
          cout << "Bitte geben Sie einen Buchstaben ein, der eliminiert werden soll." << endl;
          cin >> buchstabe;
    
          int j=0;
    
          for (int i=0; eingabe[i]!='\0'; i++)
          {
             if (eingabe[i]!=buchstabe)
             {
                ausgabe[j]=eingabe[i];
                j++;
             }
          }
    
          cout << "Resultat: " << ausgabe << endl;
    
          for (int i = 0; ausgabe[i]!='\0'; i++)
          {
             eingabe[i] = ausgabe[i];
          }
    
       } 
    }
    

    und dein problem liegt darin, dass du mit NTB-strings (null-terminated-byte-strings) arbeitest. schon dem namen nach haben diese es an sich, mit einer null beendet werden zu wollen. wenn du die einzelnen zeichen von eingabe nach ausgabe (und wieder zurück) kopierst, vergisst du beide male, die strings mit einem '\0' abzuschließen.
    ein weiteres problem ist, dass du die variable buchstabe nicht initialisierst (sie könnte zufällig schon zu beginn '!' enthalten).

    wenn du ganz schlau bist, könntest du die C++ mittel verwenden.

    #include <iostream>
    #include <algorithm>
    #include <functional>
    #include <cstring>
    using namespace std;
    
    int main ()
    {
       char eingabe[80] = {};
       char buchstabe;
    
       cout << "Eingabe: ";
       cin >> eingabe;
    
       do
       {
          cout << "Welcher Buchstabe? : ";
          cin >> buchstabe;
    
          *remove_copy_if (eingabe, eingabe + strlen(eingabe), eingabe, bind2nd(equal_to<char>(), buchstabe) = '\0';
    
          cout << "Ausgabe: " << eingabe << endl;
       } while (buchstabe != '!';
    
    }
    

    wenn du allerdings auf std::strings umsteigst (was du solltest), sieht der code gleich wieder ganz anders aus.



  • queer_boy schrieb:

    *remove_copy_if (eingabe, eingabe + strlen(eingabe), eingabe, bind2nd(equal_to<char>(), buchstabe) = '\0';
    

    Ein ganz mutiger? 🤡

    queer_boy schrieb:

    *remove_copy_if (eingabe, eingabe + strlen(eingabe), eingabe, bind2nd(equal_to<char>(), buchstabe) = '\0';
    

    Ein ganz mutiger? 🤡

    Edit:
    Und btw. wenn du schon "C++ Mittel" empfiehlst dann bitte auch richtig. Das mit dem char buffer, brauchen wir hier ja nicht näher erläutern hoffe ich (bezgl Buffer Overflows)

    #include <iostream>
    #include <algorithm>
    #include <string>
    using namespace std;
    
    int main ()
    {
       string eingabe;
       char buchstabe;
    
       cout << "Eingabe: ";
       cin >> eingabe;
    
       do
       {
          cout << "Welcher Buchstabe? : ";
          cin >> buchstabe;
    
          eingabe.erase(remove(eingabe.begin(), eingabe.end(), buchstabe, eingabe.end());
    
          cout << "Ausgabe: " << eingabe << endl;
       } while (buchstabe != '!');
    
    }
    


  • evilissimo schrieb:

    queer_boy schrieb:

    *remove_copy_if (eingabe, eingabe + strlen(eingabe), eingabe, bind2nd(equal_to<char>(), buchstabe) = '\0';
    

    Ein ganz mutiger? 🤡

    in der tat. natürlich habe ich nur darauf gewartet, das jemand diesen einwand macht 🤡

    abgesehen davon, dass das der falsche algorithmus ist, ist der code illegal, ja.

    eingabe.erase(remove(eingabe.begin(), eingabe.end(), buchstabe, eingabe.end());

    da fehlt allerdings auch eine klammer 🙂

    was mich bloß geritten hat.



  • queer_boy schrieb:

    eingabe.erase(remove(eingabe.begin(), eingabe.end(), buchstabe, eingabe.end());

    da fehlt allerdings auch eine klammer 🙂

    Stimmt, habs auch net ausprobiert (kompiliert) sondern nur hin geschrieben 😉
    Es ging mir mehr um die empfohlene technik als die Syntax

    BR
    Vinzenz


Anmelden zum Antworten