Groß und klein Schreibung im string zählen



  • wörtner schrieb:

    Schau halt nach wie du ne Variable inkrementierst.

    Komisch, bei der for-Schleife klappt es ja. 🙄



  • Der Ansatz ist schonmal richtig würde ich sagen. Ich hätte es zumindest nicht viel anders gemacht.

    Ich habe jetzt mal aus length ne Funktion gemacht -> length()
    und a zum hochzählen bewegt -> a++.

    Ich glaube das war alles was dich ausgebremst hat. Hier und da habe ich noch ein paar Kleinigkeiten geändert^^.

    #include <iostream>
    #include <string>
    
    int main() {
    
        std::string text;
        unsigned int a = 0;
        std::cout << "Text eingaben: ";
        getline(std::cin, text);
        char x;
    
        for (int i = 0; i < text.length(); i++) {
    
            x = text.at(i);
    
            if ((x >= 'a' && x <= 'z') || (x >= 'A' && x <= 'Z')) {
                a++;
            }
    
        }
        std::cout << "Der Text hat " << a << " Buchstaben" << std::endl << std::endl;
    
        system("pause");
        return 0;
    
    }
    


  • Tja, da sich der Verfasser nichteinmal mehr meldet gehe ich davon aus, es hat funktioniert. Man hätte sich ja wenigstens bedanken können bei den Leuten die geholfen haben...



  • Undank ist der Welten Lohn.



  • Die Aufgabe ist eigentlich nichts für Anfänger. Eine Lösung in C++ könnte so aussehen:

    #include <locale>
    #include <string>
    #include <iostream>
    #include <algorithm>
    
    int main()
    {
        using namespace std;
    
        // auto myLocale = locale("german");
        auto myLocale = locale();   // aktuelle globale Locale
        auto& ct = use_facet< ctype< char > >( myLocale );
        for( string text; cout << "Text eingaben: ", getline( cin, text ); )
        {
            cout << "Der Text enthaelt " 
                << count_if( begin(text), end(text), [&ct]( char zeichen ) { return ct.is( std::ctype_base::alpha, zeichen ); } ) 
                << " Buchstaben" << endl;
        }
        return 0;
    }
    

    Gibt man den Text "Größe" ein kommt als Ergebnis 3 heraus. Da stellt sich die Frage, was ist ein Buchstabe? Aktiviert man das "german" (s. Code) kommt unter Windows das Ergebnis 4. Anschließend könnte man dann über das Thema 'Code Pages' referieren.
    Es gibt 'ne Menge zu lernen, wenn man programmieren will!

    ... und - um an meinen Vorgänger Zhavok anzuschließen - nein! nach Beiträgen dieser Art meldet sich der Thread-Ersteller normalerweise nicht mehr.

    Gruß
    Werner



  • Werner Salomon schrieb:

    Gibt man den Text "Größe" ein kommt als Ergebnis 3 heraus. Da stellt sich die Frage, was ist ein Buchstabe? Aktiviert man das "german" (s. Code) kommt unter Windows das Ergebnis 4. Anschließend könnte man dann über das Thema 'Code Pages' referieren.
    Es gibt 'ne Menge zu lernen, wenn man programmieren will!

    Moin, evtl. mit wchar_t...

    #include <cstdlib>
    #include <locale>
    #include <string>
    #include <iostream>
    #include <algorithm>
    
    // Test der Lokalisierung
    
    int main() {
    
      using namespace std;
    
      locale::global( locale("") );
    
      auto &ct = use_facet< ctype< wchar_t > >( locale("") );
    
      for( wstring text; wcout << "Text eingeben: ", getline( wcin, text); )
        {
          wcout << L"Der Text enthält "
                << count_if( begin(text), end(text), [&ct](wchar_t zeichen) { return isalpha( zeichen, locale("")); } )
    
                << " Buchstaben\n";
        }
      return EXIT_SUCCESS;
    }
    

    Zumindest hier kommt bei "Größe" 5 heraus. Auch mit Großbuchstaben, inkl. großem 'SZ' 🙂

    System: OpenSuse 13.2 mit g++ 7.2.1 aus dem gcc-repo
    g++ -ansi -Wpedantic -Wall -std=c++17 -g count_alpha.cpp -o count_alpha
    Grüße!

    Edit: Ich bekomme es mit use_facet nicht hin, daher hier eine saubere Version mit isalpha 🙄

    #include <cstdlib>     // EXIT_SUCCESS
    #include <locale>
    #include <string>
    #include <iostream>
    #include <algorithm>
    
    // Test der Lokalisierung
    
    int main() {
    
      using namespace std;
    
      cerr << "Locale nach Programmstart: " << locale().name() << '\n';
    
      auto myLocale = locale("");   // Locale aus den Benutzereinstellung, zumindest unter Linux
    
      locale::global( myLocale );
    
      cerr << "Locale der Benutzereinstellung: " << myLocale.name() << '\n';
    
      for( wstring text; wcout << "Text eingeben: ", getline( wcin, text); )
        {
          wcout << L"Der Text enthält "
                << count_if( begin(text), end(text), [&myLocale](wchar_t zeichen) { return isalpha( zeichen, myLocale); } )
                << " Buchstaben\n";
        }
      return EXIT_SUCCESS;
    }
    

    Ergebnis:

    Locale nach Programmstart: C
    Locale der Benutzereinstellung: de_DE.UTF-8
    Text eingeben: Ein Sigma: σ
    Der Text enthält 9 Buchstaben
    Text eingeben: Größe
    Der Text enthält 5 Buchstaben
    Text eingeben: GRÖẞE
    Der Text enthält 5 Buchstaben
    Text eingeben: ^C

    Das Sigma wird auch auch mitgezählt...



  • So, geht doch...

    folgende Version zählt nur die Buchstaben a-z, A-Z, äöüß und ÄÖÜẞ, ich hoffe std-konform...

    War eine schwere Geburt 🙂

    Ich hatte bei

    locale::global( myLocale );
    

    meine 'myDeLocale' eingesetzt mit dem Ergebnis das es immer einen Programmausstieg ohne Fehler gegeben hat. Ob das normal ist oder am gcc bzw. an der stdlib liegt weiß ich nicht. Hatte dann sämtliche protected-Funktionen der std::ctype mit wcerr implementiert. Ohne Ergebnis.

    Bis ich Begriffen hatte das der Ausstieg wohl schon beim wcin kam, ohje 😃

    #include <cstdlib>     // EXIT_SUCCESS
    #include <locale>
    #include <string>
    #include <iostream>
    #include <algorithm>
    
    // Test der Lokalisierung
    
    struct de_wctype : std::ctype< wchar_t >
    {
      bool do_is(mask m, char_type c) const
      {   
        if ((m & alpha) && ( c == L'ä' || c == L'Ä' || c == L'ö' || c == L'Ö' || c == L'ü' || c == L'Ü' || c == L'ß' || c == L'ẞ' )) {
          return true; 
        }
        return ctype::do_is(m, c);
      } 
    };
    
    int main() {
    
      using namespace std;
    
      wcerr << "Locale nach Programmstart: " << locale().name().c_str() << '\n';
    
      auto myLocale = locale("");   // Locale aus den Benutzereinstellung, zumindest unter Linuxt
    
      de_wctype *my_de_wctype = new de_wctype; // Kein leak, siehe http://en.cppreference.com/w/cpp/locale/ctype
                                               // und http://en.cppreference.com/w/cpp/locale/ctype/~ctype
                                               // Test als lokales Objekt ergibt double-free beim beenden...
    
      auto myDeLocale = locale(myLocale, my_de_wctype);
      auto &ct = use_facet< ctype < wchar_t > >(myDeLocale);
    
      locale::global( myLocale );
      wcerr << "Locale der Benutzereinstellung: " << myLocale.name().c_str() << '\n';
    
      for( wstring text; wcout << "Text eingeben (leere Eingabe zum beenden): ", getline( wcin, text), text != L""; )
        {
          wcout << L"Der Text enthält "
                << count_if( begin(text), end(text), [&ct](wchar_t zeichen) { return ct.is( ctype_base::alpha, zeichen); } )
                << " Buchstaben\n";
        }
    
      return EXIT_SUCCESS;
    }
    

    Die Forumssoftware zeigt das große SZ in den Code-Tags nicht richtig an, also bei "|| c == L'& #7838;'" müsste ein großes SZ (ẞ) rein...

    Und source ist mit utf-8 gespeichert, evtl. gibt man besser die entsprechenden Unicode-Nummern an...

    Ergebnis:

    Locale nach Programmstart: C
    Locale der Benutzereinstellung: de_DE.UTF-8
    Text eingeben (leere Eingabe zum beenden): öäüßÖÄÜẞσ
    Der Text enthält 8 Buchstaben
    Text eingeben (leere Eingabe zum beenden): JKLÖ
    Der Text enthält 4 Buchstaben
    Text eingeben (leere Eingabe zum beenden):

    Sigma etc. wird nun ignoriert...

    Have a nice day!


Anmelden zum Antworten