setLocale() zerschießt cin



  • Hallo,
    ich wollte in der Windows 7 cmd die deutschen Umlaute anzeigen lassen und habe die über den setlocal Befehl gelößt.

    setlocale(LC_ALL,"German")
    

    Dies funktioniert bei Ausgaben über den cout befehl auch einwandfrei. Mein Problem ist aber, dass dafür jetzt die Zeichen die über den cin input in eine Variable eingelesen werden falsch dargestellt werden... (ohne den setLocale befehl ging dies einwandfrei...)
    Beispiel:

    #include <locale>
    #include <cstdlib>
    #include <iostream>
    
    int main(int argc, char *argv[])
    {
        string tmp;
    
        cin << tmp; //eingabe "öäüß"
        cout << "öäüß" << "_" << tmp; // erzeugt eine Außgabe in richtung "''³é_öäüß"
    
        setlocale(LC_ALL,"German");
    
        cin << tmp; //eingabe "öäüß"
        cout << "öäüß" << "_" << tmp; // erzeugt eine Außgabe in richtung "öäüß_''³é"
    

    Wärend der Eingabe werden die Buchstaben noch richtig angezeigt.
    Ich hoffe da gibt es eine Lösung, oder muss man sich wirklich zwischen Not oder Elend entscheiden?

    Nachtrag:
    Ich habe mir jetzt erstmal provisorisch eine kleine Cin() Funktion geschrieben, welche die falschen Zeichen in Umlaute konvertiert.

    string Cin(){
          string temp;
    
          cin >> temp;
          int pos;
          //ß
          while(temp.find((char) -31) != -1){
              pos = temp.find((char) -31);
              temp.replace(pos,1,"ß");
          }
          //ö
          while(temp.find((char) -108) != -1){
              pos = temp.find((char) -108);
              temp.replace(pos,1,"ö");
          }
          //ü
          while(temp.find((char) -127) != -1){
              pos = temp.find((char) -127);
              temp.replace(pos,1,"ü");
          }
          //ä
          while(temp.find((char) -124) != -1){
              pos = temp.find((char) -124);
              temp.replace(pos,1,"ü");
          }
          //Ö
          while(temp.find((char) -103) != -1){
              pos = temp.find((char) -103);
              temp.replace(pos,1,"Ö");
          }
          //Ü
          while(temp.find((char) -102) != -1){
              pos = temp.find((char) -102);
              temp.replace(pos,1,"Ü");
          }
          //Ä
          while(temp.find((char) -114) != -1){
              pos = temp.find((char) -114);
              temp.replace(pos,1,"Ö");
          }
          return temp;
    }
    

    Statt cin << meineVariable; muss dann halt meineVariable = Cin(); geschrieben werden... eine "richtige" Lösung wäre aber natürlich trotzdem noch schön...



  • Daveman schrieb:

    string tmp;
    
        cin << tmp; //eingabe "öäüß"
    

    Bist du dir sicher, dass du den Operator auf cin richtig anwendest?



  • Ja, das mit dem << Operator war nur ein Tippfehler hier im Forum



  • Das Problem tritt offensichtlich nur bei der Kombination cin mit string
    auf. Mit einem char array läuft es ebenfalls nicht richtig.

    setlocale(LC_ALL,"German"); 
    // cin.imbue(locale("german"));
    // cout.imbue(locale("german"));
    
    //string tmp( "öäüß"); 
    char tmp2[30];
    
    cout << "öäüß-Eingabe:"; 
    cin >>  tmp2; //eingabe "öäüß" 
    // getline (cin, tmp); 
    
    cout << "öäüß" << "_" << tmp << endl;  // erzeugt Ausgabe "öäüß_öäüß" 
    cout << "öäüß" << "_" << tmp2 << endl; // erzeugt Ausgabe "öäüß_""?á"
    

    Es gibt auch hier schon einen Beitrag zu ähnlichem Thema
    http://www.c-plusplus.net/forum/134123-full

    Die Empfehlung wstring zu verwenden hilft allerdings hier nicht.

    wstring tmp( L"öäüß"); 
    
    cout << "öäüß-Eingabe:"; 
    wcin >>  tmp; //eingabe "öäüß" 
    
    wcout << "öäüß" << "_" << tmp << endl;  // erzeugt Ausgabe "öäüß_""?á"
    

    Das Initialisieren mit deutschen Umlauten funktioniert, das Einlesen mit cin nicht 😕

    Hat jemand eine Idee wie das mit char* und basic_string richtig läuft ?


Anmelden zum Antworten