Stringverarbeitung



  • Habe jetzt folgenden Code:

    int main()
        {
        string text;
        int zaehler;
        char buchstabe;
        int i;
        int e;
        int alphaa;
    
        cout<<"Geben Sie einen Text ein!"<<endl;
        cin>>text;
    
        for (i=0;text.length();i++)
        {
            for (e=97;122;e++)
            {
                buchstabe=text[i];
                if (char(e)=buchstabe)
                {
                alphaa=alphaa+1;                       
                }            
            }         
        }
    
        cout<<alphaa<<endl;   
    
        getch();
        return 0;    
        }
    

    Nun ist das Problem das er zwar ohne Fehlermeldungen durch kompiliert, ich aber wenn ich einen Text eingabe und Enter drücke er einen Zeilenumbruch macht, er aber nichts ausgibt, genauso wenig sich das Fenstr, über eine beliebige taste schließen lässt. Woran kann das liegen?

    MfG



  • Also:
    \n steht für "New Line" und nicht für Null-Terminierung.
    \0 ist das was du suchst.
    da \0 == 0 ist:

    char arr[] = "..... oha .....";
    
    std::size_t len = 0;
    while (arr[len]) ++len;
    std::cout << arr << " => " << len << " Zeichen" << std::endl;
    

    ... für das ganze gibt es aber std::strlen (Header: <cstring>) bzw. bei std::string die Memberfunktion length().



  • Nun ist das Problem das er zwar ohne Fehlermeldungen durch kompiliert, ich aber wenn ich einen Text eingabe und Enter drücke er einen Zeilenumbruch macht, er aber nichts ausgibt, genauso wenig sich das Fenstr, über eine beliebige taste schließen lässt. Woran kann das liegen?

    Alle beiden Schleifen und die if-Abfrage sind falsch, lies dir am besten nochmal ein Tutorial durch 🙂 Habs dir bereits ausgebessert:

    for (i=0;i<text.length();i++)
    
    for (e=97;e<122;e++)
    
    if (char(e)==buchstabe)
    


  • Oh man, dabei dacht ich hätte die richtige Synthax, nervt mich jetzt ein wenig...

    Nachdem ich die doofen Fehler behoben habe und das Programm getestet hab, kam zwar endlich ein Wert aber was für einer, es ist dauerhaft: 2293853.
    Deutet für mich auf die Schleifen hin.

    Nur weiß ich nicht wie er auf diese gigantische Summe kommt, woher kann das kommen?



  • Ich verstehe die Logik hinter deinem Programm nicht wirklich, aber der Grund mit der großen Zahl ist ganz simpel. Du legst die Variable alphaa folgendermaßen an:

    int alphaa;
    

    ...das bedeutet aber, dass der Speicherplatz für diese Variable lediglich reserviert, nicht aber dessen Inhalt gelöscht wird. Du musst also alphaa auf 0 setzen, um dann vernünftig damit arbeiten zu können:

    int alphaa = 0;
    

    Merk dir das bei jeder Variable, du musst sie immer mit einem Wert vorbelegen, da der Inhalt sonst undefiniert ist 🙂



  • Die Logik von mir zur Übung war, dass ich aus einem String zb "a" heraus zählen kann. *G*



  • Nja ... das zählen würde ich in C und C++ jeweils anders lösen ^^
    also C-Stylig:

    char arr[] = "My Text contains some e's!";
    std::size_t count = 0;
    while (*arr){ if (*arr == 'e') ++count; ++arr;}
    
    // oder
    count = 0;
    for (std::size_t pos = 0; pos < std::strlen(arr); ++pos)
        if (arr[pos] == 'e') ++count;
    

    ...

    C++-Style:

    std::string my_text("My Text contains some a's!");
    std::size_t count = 0;
    for (std::size_t pos = my_text.find_first_of('a', 0); pos != std::string::npos; pos = my_text.find_first_of('a', ++pos)) ++count;
    

    ...



  • (D)Evil schrieb:

    C++-Style:

    std::string my_text("My Text contains some a's!");
    std::size_t count = 0;
    for (std::size_t pos = my_text.find_first_of('a', 0); pos != std::string::npos; pos = my_text.find_first_of('a', ++pos)) ++count;
    

    ...

    Also das geht doch noch kürzer:

    std::string my_text="My Text contains some x's!";
    std::size_t count = std::count(my_text.begin(),my_text.end(),'x');
    


  • Die vereinfachten Zeilen sind mir noch etwas zu wirr, für den Anfang. Hab das jetzt mit for to do schleifen gemacht und es geht auch. 🙂

    Vielen Dank für die zahlreichen Antworten.



  • std::string my_text="My Text contains some x's!";
    std::size_t count = std::count(my_text.begin(),my_text.end(),'x');
    

    Es wird eine Stringvariable initialisiert. Dann geht der Zähler (count) von Wortanfang (.begin()) bis Wortende (.end()) durch den String und zählt die angegebenen Zeichen die in (' ') eingeschlossen sind. Das war es auch schon.

    Count ist also eine Art Dienstleistungsprogramm für den String (und für andere Typen). Count = Zähler. Man muss nur angeben was man suchen will.

    http://www.cppreference.com/cppalgorithm/count.html

    Count kann aber noch vielmehr, siehe Referenz.



  • countword schrieb:

    Count ist also eine Art Dienstleistungsprogramm für den String (und für andere Typen). Count = Zähler. Man muss nur angeben was man suchen will.

    Auch eine interresante Sichtweise auf die STL-Algorithmen 😉


Anmelden zum Antworten