char *s;
Ordnet die Anzahl von Bytes zum Halten einer Speicheradresse (auf den meisten Systemen 32/64 Bits) benötigt. Aber da Sie den Zeiger nicht initialisieren, ist sein Wert (die Adresse Punkte zu) nicht definiert.
Ergo: fscanf versucht, auf eine nicht definierte Speicheradresse zu schreiben.
Ich initialisierte es als char * s = NULL;
Ja, der Zeiger ist nun initialisiert (yay!), Zeigt aber jetzt auf nichts.
Ergo: fscanf wird versuchen, zu nichts zu schreiben.
Die Lösung ist es, etwas Speicher zu reservieren, den fscanf verwenden kann. fscanf reserviert nicht magisch Speicher für Sie!
Sie können entweder Stapelspeicher oder dynamisch zugewiesenen Speicher (Heap) verwenden.
Stapelspeicher ist einfacher zu verwalten, ist aber viel kleiner als der Heapspeicher.
Hier ist eine Lösung, die Speicher auf dem Stapel verwendet:
// Allocates 10 bytes on the stack
// Given 1 Character = 1 Byte the
// buffer can hold up to 9 characters.
char myBuffer[10];
// Initialize s with the address of myBuffer
char *s = myBuffer;
// Call fscanf
fscanf(stream, "%9s", s);
Sie werden sich vielleicht fragen, warum ich %9s
statt %s
verwendet.
Der Grund ist, einen Pufferüberlauf zu verhindern:
fscanf nicht weiß, wie groß der Puffer ist, so müssen Sie es sagen.
Andernfalls schreibt fscanf Daten über Ihren zugewiesenen Speicher hinaus.
Ich schlage vor, Sie lesen C-Strings und Speicherverwaltung im Allgemeinen.
1. Sie überprüfen nicht das Ergebnis von 'fopen'. 2. 's' ist ein nicht initialisierter Zeiger - Wohin mit den Daten? – John3136
'Zeichen s [16]; fgets (s, sizeof s, stream); 'anstelle von' char * s; ... fscanf (stream, "% s", &s); ' – BLUEPIXY
Wenn du GCC verwendest, kompiliere immer mit' gcc -Wall -Werror' . –