Char als Zahlenwert einlesen mit scanf
-
Guten Tag
Ein Kollege von mir möchte einen zahlenwert des Typ char einlesen und hat dies mit folgender scanf-Zeile gemacht:
char zahl; scanf("%hd",&zahl);
Das Problem dabei ist, dass es je nach Compiler funktioniert oder auch nicht, weil %hd ja einen Wert von 2 Byte einlesen kann und die Variable zahl im Speicher nur ein Byte reserviert hat.
1. Er glaubt mir nicht so recht, weil es ja manchmal geht (z.B. Reihenfolge der Var-Deklaration ändern).
2. Ich konnte ihm nicht sagen mit welchem Formatzeichen er scanf betreiben müsste, um den Char als Zahlenwert einlesen zu können. Ich habe zwar noch %hhd gefunden, aber das geht irgendwie nicht.Kann mir jemand helfen?
-
1. Ob das geht, hängt von vielen Faktoren ab - Speicher-Layout, Padding-Maßnahmen des Compilers, Glück etc. Und wenn etwas schiefgeht, fällt das Problem vermutlich nicht in der eingelesenen Variablen auf, sondern in ihren Nachbarn:
char dummy1 = 1,value,dummy2 = 1; scanf("%hd",&value); printf("%d %d\n",dummy1,dummy2);//Wenn hier tatsächlich noch "1 1" ausgegeben wird, hast du Glück gehabt
2. Nein, es gibt keine Formatkennung für "char dezimal" - der sicherste Weg wäre da über eine Zwischenvariable:
short temp; scanf("%hd",&temp); zahl = (char)temp;
-
Vielen Dank für die schnelle Antwort.
Ich habe zwei Tests gemacht mit deinem Programm.
Dev C/C++ legt alle char-Variablen hintereinander im Speicher ab.
Visual C++ 2005 lässt einen Abstand von drei Byte zwischen den Variablen.Also "funktioniert" dein Programm leider mit Visual C++ 2005, wegen dem "Sicherheitsabstand" zwischen den Variablen im Speicher. Lausige Memory-Verschleuderer. Dafür weiss ich jetzt, warum Windows so viel Speicherplatz benötigt.
-
twobi schrieb:
Also "funktioniert" dein Programm leider mit Visual C++ 2005, wegen dem "Sicherheitsabstand" zwischen den Variablen im Speicher. Lausige Memory-Verschleuderer.
Das Ding nennt sich nicht "Sicherheitsabstand", sondern "Padding"