scanf mit char funktioniert nicht
-
Hallo,
ich würde gerne ein Zeichen, bzw. eine Zeichenkette eingeben und zum Test wieder anzeigen lassen. Leider werden mir während des Debuggings in Prozedurschritten die unten stehenden Fehlermeldungen angezeigt.
Hat jemand einen Tipp, warum dieses sehr einfache Programm nicht funktioniert ?
Ich benutze Visual Studio 2013.
#include "stdafx.h" void main(void) { char* var; scanf_s("%s", &var); printf("%s", var); }
+&var 0x003cf910 {0xcccccc00 <Fehler beim Lesen der Zeichen der Zeichenfolge.>} char * *
+var 0xcccccc00 <Fehler beim Lesen der Zeichen der Zeichenfolge.> char *
LG GFX
-
Der Pointer zeigt auf nichts und dann versuchst du reinzuschreiben.. Du musst erst Speicher dafür reservieren, z.B.
char var[100];
um 100 Bytes auf dem Stack zu reservieren.
Oder
char* var = malloc(100);
um 100 Bytes auf dem Heap zu reservieren.
-
Ein Pointer ist kein Array, ein Array ist kein Pointer. Dein var ist ein Pointer. Der zeigt auf was? Auf nichts! Jedenfalls auf nichts sinnvolles. Und wenn das scanf versucht dahin sein Ergebnis zu schreiben, dann knallt es. Und beim printf würde es ebenfalls knallen, wenn das Programm überhaupt so weit käme.
Du solltest dir ganz dringend noch einmal angucken, wie das mit Arrays, Zeigern und besonders Zeichenketten (die in C als Arrays von char dargestellt werden) geht. Ist ein für Anfänger schwieriges Thema, muss man aber verstanden haben.
Dazu gehört übrigens auch die Unterscheidung, dass ein char, ein Array von char und ein Zeiger auf char jeweils ganz verschiedene Dinge sind, auch wenn sie ganz ähnlich heißen. Ebenso "Zeichen" und "Zeichenfolge". Dein Text deutet da drauf hin, dass du es mit der Unterscheidung nicht so genau nimmst, wie es nötig wäre.
-
Hallo,
das hatte ich leider auch schon versucht, ohne großen Erfolg. Jetzt gibt er eine andere Fehlermeldung aus.
Wenn ich als Zeichen das kleine a eingebe und mit Enter bestätige, wird mir unten angezeigt:
+ &var 0x002efd4c {0 '\0', -52 'Ì', -52 'Ì', -52 'Ì', -52 'Ì', -52 'Ì', -52 'Ì', -52 'Ì', -52 'Ì', -52 'Ì', ...} char[100] *
+ var 0x002efd4c "" char[100]
LG GFX
-
Lass das & beim scanf weg.
-
GFX schrieb:
das hatte ich leider auch schon versucht, ohne großen Erfolg. Jetzt gibt er eine andere Fehlermeldung aus.
Das liegt da dran, dass du scanf die Adresse deines Zeigers übergibst. Das erwartet scanf aber nicht, scanf will einen Zeiger dahin, wo es hinschreiben soll, nicht einen Zeiger auf einen Zeiger darauf, wo es hinschreiben soll. Folglich versucht nun scanf auf deinen Zeiger zu schreiben, weil es denkt, das wäre der richtige Ort. Wenn du dann den Wert des Zeigers an printf übergibst, dann erwartet printf wiederum einen Zeiger auf das, woher es lesen soll. Dieser Zeiger hat dann aber den Wert des kleinen 'a' und das ist dann irgendeine Unsinnsadresse, auf die gezeigt wird -> Absturz.
Nochmals: Du musst ganz genau wissen, mit welcher Art von Objekt du gerade hantierst und welche Art von Objekt gerade erwartet wird. scanf und printf geben keinen Compilerfehler, wenn du sie mit falschen Argumenten versorgst, das kracht dann erst, wie hier, zur Laufzeit. Wenn du Compilerfehler hast, solltest du auch nicht versuchen, wild '&', '*' oder gar Casts einzufügen, bis es doch compiliert. So umgehst du nur die Sicherungsmechanismen des Compilers und zwingst ihn, irgendwelchen Unsinn zu übersetzen. Du solltest zudem unbedingt alle Warnungen des Compilers anschalten und Warnungen wie Fehler behandeln. Der Compiler ist an sich in der Lage, vielen Unsinn zu erkennen, bloß ist er laut den Regeln der Sprache dazu gezwungen, ihn trotzdem zu übersetzen, da C mit der Philosophie entwickelt wurde, dass es der Programmierer im Zweifelsfall besser weiß als der Compiler. Bei Programmieranfängern ist jedoch in der Regel das Gegenteil der Fall. Für Visual Studio, guck mal hier:
http://msdn.microsoft.com/en-us/library/thxezb7y.aspx
-
Außerdem stimmt beim scanf_s die Formatierung nicht fällt mir auf. Schau mal in den MSDN Artikel dazu.
-
Alternativ könnte man auch fgets() verwenden.