Strings Satzzeichen entfernen



  • 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 -.-



  • ix <= s1.size(); ist falsch. <= geht einen zu weit, nimm <



  • Desweiteren s2 += s1; durch s2 += s1[ix]; ersetzen.



  • ok, wenn ich < s.size mache, dann wird doch der letzte buchstabe nicht mit einbezogen oder?



  • jezt klappt es... <= habe ich aber immer noch.



  • < ist aber richtig. Denn der letzte Buchstabe ist bei Index size()-1



  • bool my_ispunct(char c) { return std::ispunct(c); }
    
    std::string remove_punct(std::string const &in) {
      std::string out;
      out.reserve(in.size());
      std::remove_copy_if(in.begin(), in.end(), std::back_inserter(out), my_ispunct);
      return out;
    }
    
    int main() {
      std::cout << remove_punct("Hallo! Welt.\n");
    }
    

Anmelden zum Antworten