widechar: Ausgabe von Sonderzeichen funktioniert nicht



  • Hallo,
    habe folgendes Beispiel von "C von A-Z" übernommen:

    /* widechar.c */
    #include <stdio.h>
    #include <stddef.h>
    
    int main(void) {
       wchar_t ch1=L'Z';
       wchar_t ch2;
       printf("Bitte ein Zeichen eingeben: ");
       scanf("%lc", &ch2);
       printf("%lc %lc\n", ch1, ch2);
       printf("wchar_t: %d Bytes\n", sizeof(wchar_t));
       return 0;
    }
    

    Leider werden bei mir die Sonderzeichen nicht ausgegeben. Benutze Linux. Hat jemand eine Ahnung, weshalb das nicht klappt?!

    Danke im Voraus!

    L. G.
    Steffo



  • Steffo schrieb:

    Hallo,
    habe folgendes Beispiel von "C von A-Z" übernommen:

    Das sagt doch schon alles 🕶



  • Tja und wo ist nun der Fehler?



  • Steffo schrieb:

    "C von A-Z"

    Hier.



  • Nach dem ihr nun gezeigt habt, dass ihr alle ganz ganz tolle Hengste seid und dem Autor von "C von A - Z" in jeder Hinsicht überlegen seid (vielen Dank an den Moderator des Boards, der das Ganze initiiert hat - sehr vorbildlich!), könnte mal jemand zur Abwechslung auf den von mir geposteten Code eingehen.

    Wenn jemand ansonsten zum Code nichts zu melden hat, der möge doch bitte im Heise-Forum trollen gehen.

    Vielen Dank!



  • Erstens ist dies hier nicht "mein" Board 😉
    Zweitens: Der Autor JW ist hier dafür bekannt, daß er zwar oberflächlich gut aussehende Bücher schreibt, aber dabei viel fabriziert was man bestenfalls als schlechten Stil bezeichnen kann. Und wir sind dann das Auffangbecken, wo sich JW-geschädigte Programmieranfänger dann erklären lassen müssen, daß sie "Müll" gelernt haben.
    Drittens: Ideone gibt mir bei deinem Code einige Warnungen, daß die Parameter nicht zu den Format-Spezifizierern passen (und daß du den Rückgabewert von scanf() nicht verarbeitest) - vermutlich liegt darin schon dein Problem.



  • @Fragesteller:
    Etwas Zurückhaltung täte auch dir ganz gut, du hast hier keinerlei Anspruch, dass sich jemand hier sofort deines Problems annimmt (dir u.U. deine Hausaufgaben fertig hinschreibt) und es auch noch in einer dir genehmen Weise erklärt.
    Gehe davon aus, dass die unterschiedlichsten Leute hier bezüglich Pfuscher JW einer Meinung sind und hier nicht ständig bereit sind, allen Neulingen den hier präsentierten zusammengegoogelten JW Pfusch zum tausendsten Mal haarklein zu erläutern.

    /* widechar.c */
    #include <stdio.h>
    #include <wchar.h>
    
    int main() {
       wchar_t ch1=L'Z';
       wchar_t ch2;
       printf("Bitte ein Zeichen eingeben: ");
       wscanf(L"%c", &ch2);while('\n'!=getchar());
       wprintf(L"%c %c\n", ch1, ch2);
       printf("wchar_t: %ld Bytes\n", (long)sizeof(wchar_t));
       return 0;
    }
    

  • Mod

    Steffo schrieb:

    Nach dem ihr nun gezeigt habt, dass ihr alle ganz ganz tolle Hengste seid und dem Autor von "C von A - Z" in jeder Hinsicht überlegen seid (vielen Dank an den Moderator des Boards, der das Ganze initiiert hat - sehr vorbildlich!), könnte mal jemand zur Abwechslung auf den von mir geposteten Code eingehen.

    Wenn jemand ansonsten zum Code nichts zu melden hat, der möge doch bitte im Heise-Forum trollen gehen.

    Was beschwerst du dich, wenn man dich warnt? Jürgen Wolf ist ein Hackautor, seine Bücher gehören als Popoabwischmaterial auf Toiletten und du bringst bloß ein weiteres Beispiel, warum das ist.

    Versuch mal so:

    #include <stdio.h>
    #include <stddef.h>
    #include <locale.h>
    
    int main(void) {
      setlocale(LC_CTYPE, "");
      wchar_t ch2;
      printf("Bitte ein Zeichen eingeben: ");
      scanf("%lc", &ch2);
      printf("%lc\n", ch2);
      return 0;
    }
    

    Falls das so nicht gehen sollte, ist die Umgebung in der du das Programm laufen lässt nicht da drauf ausgelegt. Kommt leider noch viel zu oft vor. Wenn du aber sonst auch Sonderzeichen in deiner Konsole benutzen kannst, dürfte dies nicht der Fall sein.



  • Danke, für die hilfreichen Antworten.
    Ich habe natürlich keinen Anspruch, dass man mir bei meinem Problem hilft, allerdings erwarte ich als Anfänger auch einen angemessenen Respekt (den hat einfach jeder Mensch) und der ist nicht gegeben, wenn man wie ein Troll antwortet (anders kann ich das einfach nicht beschreiben). Der, der keine Lust hat sich mit meinem Problem zu beschäftigen, ist nicht gezwungen dies zu tun und braucht deshalb nicht zu antworten - ganz einfach.

    Die Lösung von SeppJ funktioniert, die von Wutz nicht. Ich bekomme da folgenden Output:

    Bitte ein Zeichen eingeben: Ü
    wchar_t: 4 Bytes

    Bei der Lösung von SeppJ frage ich mich, wie das überhaupt funktionieren kann, da ich durch Recherche herausgefunden habe, dass sich das Argument "LC_CTYPE" nur auf Funktionen mit einem Byte auswirkt, allerdings hat ja der Typ wchar_t mindestens zwei Byte. Wie kann das also funktionieren?

    http://www.imb-jena.de/~gmueller/kurse/c_c++/c_locale.html

    Danke im Voraus.

    L. G.
    Steffo


  • Mod

    Steffo schrieb:

    Bei der Lösung von SeppJ frage ich mich, wie das überhaupt funktionieren kann, da ich durch Recherche herausgefunden habe, dass sich das Argument "LC_CTYPE" nur auf Funktionen mit einem Byte auswirkt, allerdings hat ja der Typ wchar_t mindestens zwei Byte. Wie kann das also funktionieren?

    http://www.imb-jena.de/~gmueller/kurse/c_c++/c_locale.html

    Das ist schlicht und einfach falsch. Lost in translation?

    ANSI C Standard schrieb:

    LC_CTYPE affects the behavior of
    the character handling functions and the multibyte and wide character functions.

    Mit Internettutorials zu C und C++ wäre ich allgemein vorsichtig. Die sind fast nie gut. Eigentlich kenne ich kein einziges gutes. Und ganz besonders vorsichtig wäre ich mit einem, welches die ominöse Sprache C/C++ lehren will. Und dreifach vorsichtig wäre ich bei Unterichtsmaterial zu einem Uni-Porgrammierkurs. Auch wenn's nach Vorurteil klingt: Was den Stil angeht, sind Professoren meistens 30 Jahre zurück. Und da es meistens eher um Algorithmen geht, wird es mit der technischen Genauigkeit beim Programmieren nicht so genau genommen. Hauptsache es läuft irgendwie. Sonst käme man auch gar nicht mit dem eigentlichen Stoff durch im Semester.



  • OK, da hat wohl meine verlinkte Internetquelle massiv falsch abgeschrieben, denn zwischen 1 Byte und Multibyte sind Welten!
    Welches C-Buch würdest du mir empfehlen? Ich muss sagen, dass ich nun ziemlich verschreckt bin, was C-Bücher und Tutorials angeht...

    L. G.
    Steffo


  • Mod

    Kernighan & Ritchie, The C Programming Language, englische Ausgabe.
    The C Programming Language | ISBN: 0131103628



  • Such mal im Web nach The GNU C-Programming tutorial.
    Das habe ich verwendet um mir C beizubringen. Ist für mich sehr gut gewesen
    und was ich machen wollte, funktioniert.
    Hab den Link gerade nicht zur Hand.
    Und für die grafische Oberfläche, falls gewünscht, Graphapp - läßt sich
    auch unter Windows kompilieren und ist einfach im Aufruf aus C.
    Nachdem ich in meiner langen EDV-Tätigkeit erst PL/1, Assembler und
    CObOL, später Abap gelernt habe, hat halt noch C gefehlt um unter Linux
    auch noch ein bisserl was zu entwickeln und da kam mir dieses Tutorial
    gerade recht - war allerdings ein recht heftiges Umdenken von z. B
    Cobol nach C.



  • Danke, gucke mir erst mal das GNU-C Programming Tutorial an, da ich als Student knapp bei Kasse bin. 😉 Wenn ich mich mit C anfreunden kann, werde ich mir das Standardwerk holen. 😉

    L. G.
    Steffo



  • So, das läuft jetzt auch für POSIX-lastige Systeme.

    http://ideone.com/vpg9R


  • Mod

    Student? Guck doch mal in der Uni-Biliothek. der K&R ist das Standardwerk zu C (die beiden sind Miterfinder der Sprache), das haben die in der Uni-Bibliothek bestimmt zigfach.


  • Mod

    Wutz schrieb:

    So, das läuft jetzt auch für POSIX-lastige Systeme.

    http://ideone.com/vpg9R

    Also bei mir landet das in einer Endlosschleife, wenn ich ein Sonderzeichen eingebe. Meine Konsole gibt dem Programm nämlich ein UTF-8 Zeichen weiter. Und ich bin damit sicherlich nicht alleine.



  • SeppJ schrieb:

    Student? Guck doch mal in der Uni-Biliothek. der K&R ist das Standardwerk zu C (die beiden sind Miterfinder der Sprache), das haben die in der Uni-Bibliothek bestimmt zigfach.

    Stimmt, da war doch was! - Bibliothek! 🙄 Mir steht sogar die beste Hochschulbibliothek in ganz Deutschland zur Verfügung.

    Muss da unbedingt mal vorbeischauen. 🙂

    EDIT:

    SeppJ schrieb:

    Wutz schrieb:

    So, das läuft jetzt auch für POSIX-lastige Systeme.

    http://ideone.com/vpg9R

    Also bei mir landet das in einer Endlosschleife, wenn ich ein Sonderzeichen eingebe. Meine Konsole gibt dem Programm nämlich ein UTF-8 Zeichen weiter. Und ich bin damit sicherlich nicht alleine.

    Dito.

    L. G.
    Steffo


Anmelden zum Antworten