Scanf- Problem mit Integer einlesen
-
Hey Leute,
ich habe eine Struktur die wie folgt aussieht:
typedef struct buch { char titel[MAX_TITEL_VERLAG]; char verlag[MAX_TITEL_VERLAG]; int isbn; AUTOR *autor; struct buch *next; // Zeiger auf nächstes Buch struct buch *prev; // Zeiger auf vorheriges Buch } BUCH;
im einer anderen Funktion initialisiere ich dann ein Buch und will die Werte einfügen:
BUCH *buch = malloc(sizeof(BUCH)); scanf("%13d", buch->isbn);
Nun wirft mir der Compiler folgende Warnung:
[codeWarnung: Format »%d« erwartet Argumenttyp »int *«, aber Argument 2 hat Typ »int« [-Wformat]
Wenn ich das Programm ausführe stürzt es beim scanf() ab.
Meine Frage nun: Wieso? Meiner Meinung nach mache ich einen Zeiger auf die isbn, welche vom Datentyp ins ist. Bei den char-Arrays funktioniert es ja genauso.Bitte um Aufkärung!
Gruß
-
Der Compiler hat immer Recht. Erinnerung an die zweite Lektion im C-Buch: Lies mal einen einzelnen int, einen einzelnen char und eine Zeichenkette ein.
int i; scanf(/*Was muss hier hin?*/); char c; scanf(/*Was muss hier hin?*/); char string[50]; scanf(/*Was muss hier hin?*/);
P.S.: Ich will dich ja nicht entmutigen, aber ist die Aufgabe nicht ein bisschen schwierig für dich? Bäume bauen ist nicht einfach, da muss man topfit im Umgang mit Zeigern, structs, malloc & Co. sein.
-
Das
buch->isbn
ist einint
. So hast du es ja auch definiert.Überleg mal was du bei scanf angeben musst, wenn du eine einfache int-Variable einlesen willst.
-
Okey, ist mir jetzt klar. Scanf braucht einen Zeiger. Die char-Arrays lese ich mit fgets() ein.
&(buch->isbn)
müsste dann eigentlich funktionieren oder?
@SeppJ: Wir hatten C vor Jahren in der Schule und nun will ich mich wieder einarbeiten. Ich denke ich schaff das schon irgendwie ;).
-
...
-
Sund0se schrieb:
Okey, ist mir jetzt klar. Scanf braucht einen Zeiger. Die char-Arrays lese ich mit fgets() ein.
Du musst verdammt aufpassen, wenn du scanf und fgets mischt.
scanf lässt das '\n' (von der Entertaste) im Eingabestrom stehen. fgets liest aber nur bis zum nächsten 'n'.Bedenke, dass die ISBN keine Zahl zum rechnen ist. Ein
int
ist dafür der falsche Datentyp.
-
DirkB schrieb:
Sund0se schrieb:
Okey, ist mir jetzt klar. Scanf braucht einen Zeiger. Die char-Arrays lese ich mit fgets() ein.
Du musst verdammt aufpassen, wenn du scanf und fgets mischt.
scanf lässt das '\n' (von der Entertaste) im Eingabestrom stehen. fgets liest aber nur bis zum nächsten 'n'.Bedenke, dass die ISBN keine Zahl zum rechnen ist. Ein
int
ist dafür der falsche Datentyp.Hey Dirk, danke für deine Antwort!
Ja da hast du recht mit der ISBN. Mal angenommen ich lese vorher etwas ein mit scanf und anschließend etwas mit fgets, dann überspringt er ja die zweite Eingabe. Wie löse ich das Problem am besten? Oder gibt es Alternativen zu scanf? Mir war das sowieso nie sympatisch
-
Wenn du scanf verstanden hast, ist es kein Problem.
Meist macht der User falsche Eingaben auf die du reagieren musst. Aber das ist ein anderes Kapitel.Eine Lösung wäre: http://www.c-plusplus.net/forum/p1146014#1146014
oderscanf(" %[^\n]", buch->verlag); // achte auf die Leerzeichen
-
Ja ich habe mich noch nicht so genau damit beschäftigt. Jedenfalls danke für den Tipp!