Merkwürdige Ergebnisse mit mehreren Texteingaben über scanf
-
Hallo! Ich bin eigentlich sehr neu in C und wollte gerade ein paar Experimente mit Operatoren machen, als sich mir ein Problem ergab (Sorry für die Formulierung ;)). Wahrscheinlich ist mein Fehler so primitiv, dass ich mich schämen müsste, aber naja.
Wenn man in diesen Code
#include <stdio.h> int main() { char mae = 0, mae2 = 0; scanf("%d", &mae); scanf("%d", &mae2); if (mae == 0 || (mae == 1 && mae2 >= 0)) { printf("Text 1\n"); } else { printf("Text 2\n"); } return 0; }
erst 2, dann 5 eingibt, so erhält man aus welchem Grund auch immer den Text 1. Ein ähnliches Problem hatte ich schon hier:
#include <stdio.h> void main() { int Art = 0; char z1 = 0, z2 = 0, erg = 0; printf("Welche Rechenart soll verwendet werden?\n"); printf("(0 fuer Addition, 1 fuer Subtraktion, 2 fuer Multiplikation, 3 fuer Division)\n"); scanf("%d", &Art); printf("Die erste Zahl bitte\n"); scanf("%d", &z1); printf("Die zweite Zahl bitte\n"); scanf("%d", &z2); printf("%d", Art); if (Art == 0) { erg = z1 + z2; printf("%d und %d ergeben zusammen %d.", z1, z2, erg); } if (Art == 1) { erg = z1 - z2; printf("%d und %d ergeben subtrahiert %d.", z1, z2, erg); } if (Art == 2) { erg = z1 * z2; printf("%d und %d ergeben multipliziert %d.", z1, z2, erg); } if (Art == 3) { erg = z1 / z2; printf("%d und %d ergeben dividiert %d.", z1, z2, erg); } }
Ich vermute, das hat irgendetwas mit den Variablen zu tun, da diese (das habe ich schon getestet) irgendwie ihren Wert ändern, wenn ich mehrere Sachen hintereinander einlese.
-
Der scanf-Formatspezifizierer %d benötigt einen Zeiger auf int. char ist zu klein dafür. Was für einen Compiler benutzt du und welche Warnungseinstellungen? Manche geben eine Warnung aus, wenn die Typen nicht zu den Formatangaben passen.
-
Wenn scanf erwartet, einen Integer schreiben zu können, an der Stelle aber nur Platz für einen char ist, dann passieren eben ungewöhnliche Dinge.
In gewissen C-Dialekten kannst du auch char als Ganzzahlen lesen (%hhd mit glibc), das ist natürlich nicht portabel. Aber wesentlich einfacher: Nimm doch int als Datentyp.
-
Bashar schrieb:
Der scanf-Formatspezifizierer %d benötigt einen Zeiger auf int. char ist zu klein dafür. Was für einen Compiler benutzt du und welche Warnungseinstellungen? Manche geben eine Warnung aus, wenn die Typen nicht zu den Formatangaben passen.
Vielen Dank, Leute! Das hat geholfen.
Und nein. Mein Compiler Code::Blocks hat mich nicht gewarnt. Böser Compiler!
-
dbs schrieb:
Und nein. Mein Compiler Code::Blocks hat mich nicht gewarnt. Böser Compiler!
Das ist kein Compiler, sondern eine IDE. Unter deinem Code::Blocks wird sicherlich ein GCC als Compiler stecken (denn wenn du diese Standardeinstellung geändert hättest, dann hättest du gewusst, dass Code::Blocks kein Compiler ist). GCC kann diese Art von Warnung schon ewig lange. Musst du nur anschalten. Gibt wahrscheinlich in der IDE irgendwo einen Schalter für Warnoptionen. Ansonsten gib dem Compiler die Kommandozeilenoption "-Wall" (evtl. auch noch "-Wextra") mit. Warnungen sollte man immer anhaben, gerade bei neueren GCCs (4.6 und neuer) sind die Warnungen sehr gut gemacht.