wchar_t mit printf() ausgeben
-
Hallo,
ich lese z.Z. "C von A bis Z" (http://openbook.galileocomputing.de/c_von_a_bis_z/) und wollte den Quellcode aus Kapitel 5.13 (http://openbook.galileocomputing.de/c_von_a_bis_z/005_c_basisdatentypen_013.htm#mja2e8964c159519b6ecf05f2c4bc7689e) kompilieren, bekomme jedoch folgende Fehlermeldung:
widechar.c: In Funktion »main«:
widechar.c:12: Warnung: Format »%lc« erwartet Typ »wint_t«, aber Argument 2 hat Typ »wchar_t«
widechar.c:12: Warnung: Format »%lc« erwartet Typ »wint_t«, aber Argument 3 hat Typ »wchar_t«Das ist der Quellcode von mir: (Ich habe es nicht 1:1 übernommen, da mir der Stil vom Autor nicht ganz so gut gefällt.)
#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; }
Die Ausgabe funktioniert zwar einwandfrei, aber die Warnung stört mich aber doch ein wenig. Ich habe mit Google nach "wchar_t printf" gesucht und habe sogar ein paar Sachen gefunden. Zum einen, wprintf() als auch wie im Beispiel verwendet, "%lc" als Formatstring.
Könnte mir jemand erklären, wieso das passiert? Haben sich die Autoren geirrt?
Danke
-
Das Buch und sein Autor sind in der Tat berüchtigt, und du solltest dir schleunigst ein besseres zulegen, aber in diesem speziellen Fall ist der Compiler etwas übereifrig.
%lc erwartet ein wint_t-Argument, welches intern dann aber auf wchar_t gekürzt und analog zu %ls verarbeitet wird (vgl. 7.19.6.1, 7.24.1 im Standard). wint_t ist ein Typ, der mindestens alle wchar_t-Werte und WEOF annehmen kann, wchar_t kann also gefahrlos darauf erweitert werden, und die Warnung ist eigentlich unnötig.
Um sie loszuwerden, kannst du den wchar_t explizit nach wint_t casten:
printf("%lc %lc\n", (wint_t) ch1, (wint_t) ch2);
-
Wobei ich denke (habe es auch gelesen) dass wenn man den Stil des Autors nicht 1:1 übernimmt und mit Fehlern in Listings rechnet man mit diesem Buch ne gute Grundlage hat (also ich hatte bisher noch keine Probleme obwohl ich C damit gelernt hab)
-
linux_c89 schrieb:
Wobei ich denke (habe es auch gelesen) dass wenn man den Stil des Autors nicht 1:1 übernimmt und mit Fehlern in Listings rechnet man mit diesem Buch ne gute Grundlage hat (also ich hatte bisher noch keine Probleme obwohl ich C damit gelernt hab)
Also wenn die Beispiele aus dem Jürgen Wolf Bashthread stimmen, dann hat er auch in seinem C Buch ein paar dicke Hauer. Aber im großen und ganzen soll es wohl noch brauchbar, wenn auch nicht gut, sein. Das C++ Buch muss aber wirklich übel sein, von dem was man im C++ Forum so sieht. Und da es sich so gut verkauft, kommen dort täglich etwa 3 Fragen die unmittelbar darauf zurückzuführen sind.
-
Vielen Dank für eure Antworten. seldon, dir vor allem Danke für die Erklärung.
Also ich habe jetzt bestimmt in dem einen Kapitel wieder etliche Fehler gefunden. Nicht nur Rechtschreibfehler, sondern auch Fehler im Code. Ich bin zwar kein kompletter C-Neuling, wollte aber mal ein reines C-Buch lesen um mein "C-Wissen" zu vervollständigen. Nur es macht einfach immer weniger Spaß.
Ich glaube ich suche mir tatsächlich ein anderes Buch – wie gut nur, dass ich nur die online-Version bisher las.Danke
-
Visual Studio auf Multibyte stellen!
wchar_t ch1[34] = L"Alternative+Mundi+Lippe+Zahn=Stinkt";
printf("Ausgabe wchar : %s",ch1);