Hallöchen.
Folgende Frage finde ich auf einem Informatik-Übungsblatt aus dem
Studium. Es geht um C.
7.) Geben Sie die Anweisung zum Einlesen einer ganzen Zahl von der
Tastatur an. Der Zahl
soll in einer char-Variablen gespeichert werden.
Ich vermute, dass die "richtige" Antwort folgende ist (weil der Prof das
auch in der Vorlesung schon ein mal gezeigt hat).
1 | char Zahl;
|
2 | scanf("%d", &Zahl);
|
Frage: Das ist doch falsch oder? Wahrscheinlich erzeugt es keine Fehler
auf einem heutigen 32 Bit System, da die char Variable von 24
nachfolgenden Bits auf 32Bit gepaddet wird und somit scanf die
restlichen 3 Bytes in "toten" Speicherbereich schreibt. Aber falsch ist
es doch trotzdem?
Folgendes Testprogramm habe ich mit Visual C++ probiert:
1 | #include <stdio.h>
|
2 |
|
3 | main()
|
4 | {
|
5 | union
|
6 | {
|
7 | int A;
|
8 | char B;
|
9 | } test;
|
10 |
|
11 | test.A = 0xAAAAAAAA;
|
12 |
|
13 | scanf("%x", &test.B);
|
14 |
|
15 | printf("%X", test.A);
|
16 | getch();
|
17 | }
|
Ergebnis: Wenn ich beispielsweise "CC" eingebe, gibt printf "CC" auch
wieder aus.
Resultat: scanf schreibt 4 Byte (bei sizeof(int) == 32) an eine
Speicherstelle, wo nur ein Byte hingehört.
Resultatsresultat:
Die (Eine) richtige Lösung ist:
1 | int Temp;
|
2 | char Zahl;
|
3 |
|
4 | scanf("%d", Temp);
|
5 | Zahl = Temp; /* Kein Überlaufscheck */
|
Oder halt über eine Union, ähnlich wie oben.
Richtig, oder Falsch? :-) Danke für eine Antwort.
PS: Die folgenden Zwei Fragen werfen ein ähnliches Problem auf:
8.) Geben Sie die Anweisung an, die den Inhalt einer char-Variablen als
ganze Zahl im De-
zimalformat auf dem Bildschirm ausgibt.
9.) Geben Sie die Anweisung an, die den Inhalt einer char-Variablen als
ganze Zahl im He-
xadezimalformat auf dem Bildschirm ausgibt.