Strings Satzzeichen entfernen



  • Hallo,
    ich lese das Buch "C++ primer" und bin bei den Strings. Zum Abschluss dieses Themas gibt es einige Übungen (wem es hilft: Übung 3.10).
    Hier die Aufgabenstellung:
    Schreiben Sie ein Programm, das die Satzzeichen aus einen String entfernt. Die Eingabe soll ein String mit Satzzeichen sein, die Ausgabe ein String, in dem die Satzzeichen fehlen.
    Ich habe schon eine Schleife geschrieben, die jedes Zeichen danach prüft, ob das Zeichen ein Satzzeichen ist. Wenn ja ist die If-Bedingung erfüllt. Nun weiß ich nicht wie ich dann das Satzzeichen entferne. In meinem Buch wurden noch nichts zum Entfernen von Stringzeichen gesagt. Gibt es da eventuell eine ganz simple Möglichkeit?
    Danke schon mal für die Antworten.
    Mfg Marco
    Hier der Quelltext:

    #include <iostream>
    #include <string>
    #include <cctype>
    using namespace std;
    int main()
    {
    string s; //definiert den String s
    cin >> s;
    cout << endl; //macht Zeilenumbruch
    for (string::size_type index = 0; index <= s.size(); ++index)
    {
    if (ispunct(s[index])) // klappert alle Zeichen des Strings ab, bis es auf ein Satzzeichen trifft.
    {
    //was muss hier stehen, um das Satzzeichen zu entfernen?
    }
    }
    }


  • Mod

    Wenn das Löschen von Zeichen aus einem String noch nicht vorgekommen ist, versuch doch einen neuen String zu basteln, in den du nur die Nicht-Satzzeichen überträgst.



  • Und wie übertrage ich die Nicht-Satzzeichen?
    Könntest du ein Beispiel posten?
    Danke



  • newString += s[index]



  • std::string new_string;
    for(int i = 0; i <= old_string.size(); i++)
    {
        if(old_string[i] != ",")
        {
            new_string += old_string[i];
        }
    }
    


  • Danke
    Jedoch bekomme ich beim compilieren jezt folgende Fehlermeldung:
    "ISO C++ forbids comparison between pointer and integer"

    Hier mein Quelltext:

    #include <iostream>
    #include <string>
    #include <cctype>
    using namespace std;
    int main()
    {
        string s;
        cout << endl;
        getline(cin, s);
        string s2;
        for (string::size_type index = 0; index <= s.size(); ++index)
        {
            if (s[index] != ",")
            {
                s2 += s[index];
            }
            else if (s[index] != ".")
            {
                s2 += s[index];
            }
            else if (s[index] != ":")
            {
                s2 += s[index];
            }
            else if (s[index] != ";")
            {
                s2 += s[index];
            }
            else if (s[index] != "?")
            {
                s2 += s[index];
            }
            else if (s[index] != "!")
            {
                s2 += s[index];
            }
        }
        cout << s << endl;
    }
    

  • Mod

    Einfachen Anführungsstrichen '' markieren ein Zeichen.

    Doppelte Anführungszeichen "" markieren einen const char[].

    Das sind zwei sehr sehr unterschiedliche Sachen.



  • Ups natürlich, du musst ":" mit ':' ersetzen.
    Edit:
    Ich würd dir aber das hier empfehlen, statt der ganzen if Verzweigungen:

    int main()
    {
        std::string vorzeichen = ",.:;?!";
        std::string old_string = "H.a,l:l;o";
        std::string new_string;
        bool found = false;
        for(int i = 0; i <= old_string.size(); i++)
        {
            for(int j = 0; j <= vorzeichen.size(); j++)
            {
                if(old_string[i] == vorzeichen[j])
                {
                    found = true;
                    break;
                }
            }
            if(!found)
            {
                new_string += old_string[i];
            }
            found = false;
        }
        std::cout << new_string;
    }
    


  • #include <iostream>
    #include <string>
    #include <cctype>
    using namespace std;
    int main()
    {
        string s;
        cout << endl;
        getline(cin, s);
        string s2;
        for (string::size_type index = 0; index <= s.size(); ++index)
        {
            if (s[index] != ',')
            {
                s2 += s[index];
            }
            else if (s[index] != '.')
            {
                s2 += s[index];
            }
            else if (s[index] != ':')
            {
                s2 += s[index];
            }
            else if (s[index] != ';')
            {
                s2 += s[index];
            }
            else if (s[index] != '?')
            {
                s2 += s[index];
            }
            else if (s[index] != '!')
            {
                s2 += s[index];
            }
        }
        cout << s << endl;
    }
    

    Jetzt ist das Programm ausführbar, jedoch gibt er die Satzzeichen trotzdem mit aus...



  • Du gibst ja auch den alten string aus und nicht den Neuen...



  • OK dummer fehler...

    #include <iostream>
    #include <string>
    #include <cctype>
    using namespace std;
    int main()
    {
        string s;
        cout << endl;
        getline(cin, s);
        string s2;
        for (string::size_type index = 0; index <= s.size(); ++index)
        {
            if (s[index] != ',')
            {
                s2 += s[index];
            }
            else if (s[index] != '.')
            {
                s2 += s[index];
            }
            else if (s[index] != ':')
            {
                s2 += s[index];
            }
            else if (s[index] != ';')
            {
                s2 += s[index];
            }
            else if (s[index] != '?')
            {
                s2 += s[index];
            }
            else if (s[index] != '!')
            {
                s2 += s[index];
            }
        }
        cout << s2 << endl;
    }
    

    Aber jetzt gibt er immer noch das gleiche aus, was man eingibt... mit Satzzeichen.

    Und bei der zweiten Variante noch schlimmer:

    #include <iostream>
    #include <string>
    using namespace std;
    int main()
    {
        string s1;
        getline(cin, s);
        string s2 = ",.;:?!";
        string s3;
        for (string::size_type ix = 0; ix <= s1.size(); ++ix)
        {
            for (string::size_type in = 0; in <= s2.size(); ++in)
            {
                if (s1[ix] != s2[in])
                {
                    s3 += s1;
                }
            }
            cout << s3 << endl;
        }
    }
    

    Hier gibt er als Ausgabe ca. 20 mal das gleiche aus wie bei der Eingabe, dirket hintereinander...
    Jezt bin ich verwirrt 😃


  • Administrator

    Ok, mal schauen bei deiner if-Orgie:
    Das aktuelle Satzzeichen ist ein ':' . Dann wird überprüft, ob es ungleich einem ',' ist. Das ist wahr, also wird das Zeichen angefügt ... :p

    Grüssli



  • mrco17 schrieb:

    #include <iostream>
    #include <string>
    using namespace std;
    int main()
    {
        string s1;
        getline(cin, s);
        string s2 = ",.;:?!";
        string s3;
        for (string::size_type ix = 0; ix <= s1.size(); ++ix)
        {
            for (string::size_type in = 0; in <= s2.size(); ++in)
            {
                if (s1[ix] != s2[in])
                {
                    s3 += s1;
                }
            }
            cout << s3 << endl;
        }
    }
    

    Hier gibt er als Ausgabe ca. 20 mal das gleiche aus wie bei der Eingabe, dirket hintereinander...

    Ja ich weiß, ich bin heute auch nicht ganz bei der Sache. Ich hab es aber schon editiert, guck es dir nochmal an. Funktioniert jetzt definitiv 😉



  • Das mit found und break hatte ich noch nicht...
    Aber trotzdem danke



  • @Dravere
    Ok.. wie kann ich das beheben? Eigentlich nur mit der Methode von Freaky oder?



  • Da muss es doch eine Simple Lösung geben 😃
    Denn so viel habe ich ja noch nicht gelernt...
    Zur Hilfe: Der momentane Abschnitt hat sich mit <cctype> beschäftigt. Das heißt Funktionen wie: isdigit, isalnum,...
    Mein erster Ansatz war ja auch mit ispunct um die Satzzeichen zu finden, nur leider wusste ich nicht wie man sie dann entfernt 😃
    Aber ich vermute, dass es da eine ganz einfache Lösung gibt..



  • #include <iostream>
    #include <string>
    #include <cctype>
    using namespace std;
    int main()
    {
        string s, s2;
        cin >> s;
        for (string::size_type index = 0; index != s.size(); ++index)
        {
            if (!ispunct(s[index])
                s2 += s[index];
        }
        cout << s2 << endl;
    }
    


  • Klammer beim if vergessen.



  • #include <string>
    #include <algorithm>
    #include <cctype>
    #include <iostream>
    
    int main(int, char*[]){
        std::string test = "xcvb uzxcuvibxcvb.- sdf.s ,sdfs.fsd fsdf.sdf:;sdfsdf";
    
        test.erase(remove_if(test.begin(), test.end(), static_cast<int(*)(int)>(std::ispunct)), test.end());
    
        std::cout << test << std::endl;
    }
    


  • Danke Bruder Lustig
    Meins sieht jezt so aus:

    #include <iostream>
    #include <string>
    #include <cctype>
    using namespace std;
    int main()
    {
        string s1;
        getline(cin, s1);
        string s2;
        for (string::size_type ix = 0; ix <= s1.size(); ++ix)
        {
            if (!ispunct(s1[ix]))
            {
                s2 += s1;
            }
        }
        cout << s2 << endl;
    }
    

    Wenn ich das Programm ausführe, wird die Eingabe mit Satzzeichen ausgegeben: Allerdings 10mal hintereinander -.-


Log in to reply