Wie zu Lesen, die Standardeingabe in einer string-variable, bis ein EOF-Zeichen in C?
Bin ich immer der "Bus-Error" versucht zu Lesen stdin
in eine char*
variable.
Ich die einfach nur Lesen wollen ganze Zeug über stdin
und legen Sie es zuerst in eine variable, dann arbeiten Sie weiter auf die variable.
Mein Code ist wie folgt:
char* content;
char* c;
while( scanf( "%c", c)) {
strcat( content, c);
}
fprintf( stdout, "Size: %d", strlen( content));
Aber irgendwie bekomme ich immer "Bus error" zurückgegeben, indem cat test.txt | myapp
, wo myapp
ist der kompilierte code oben.
Meine Frage ist, wie lese ich stdin
bis ein EOF-Zeichen in eine variable? Wie du im code sehen, ich will nur drucken die Größe der input kommt über stdin, in diesem Fall sollte gleich der Größe der Datei test.txt
.
Ich dachte nur mit scanf
genug sein würde, vielleicht gepufferten Weise zu Lesen stdin
?
- Warum nicht einfach stat() auf, um die Größe der Datei, dann verwenden Sie den Datei-Größe + 1 zu (versuchen zu) malloc den Puffer und dann read() auf den Puffer?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Erste, Sie ' re passing nicht initialisierte Zeiger, was bedeutet, dass
scanf
undstrcat
schreiben von Speicher, die Sie nicht besitzen. Zweitensstrcat
erwartet zwei null-terminierte Zeichenfolgen, während c nur ein Charakter. Dies wird wieder dazu führen, dass es zu lese-Speicher, die Sie nicht besitzen. Sie nicht brauchen, scanf, weil Sie nicht tun, werden keine Echtzeit-Verarbeitung. Schließlich, Lesen ein Zeichen in einer Zeit, ist unnötig langsam. Hier ist der Anfang einer Lösung, bei der ein in der Größe veränderbares Puffer für die Letzte saite, und einen festen Puffer für die Funktion fgets nennenEDIT: Wie Wolfer angedeutet, eine NULL in Ihrem Eingang verursacht, dass sich der string vorzeitig beendet werden, wenn die Verwendung der Funktion fgets. getline ist eine bessere Wahl, wenn verfügbar, da Sie die Speicherzuordnung verarbeitet und hat keine Probleme mit NUL-Eingang.
invalid conversion from ‘void*’ to ‘char*’ [- fpermissive]
aufchar *content = malloc(sizeof(char) * BUF_SIZE);
undcontent = realloc(content, contentSize);
mit gcc 4.8.1 ...0x00
in stdin.Dein problem ist, dass Sie nie zugeteilt
c
undcontent
, so sind Sie nicht auf den überall definiert-Sie sind wahrscheinlich deutete auf einige nicht zugeordneten Speicher, oder etwas, das überhaupt nicht existiert. Und dann setzen Sie Daten in Ihnen. Sie zuteilen müssen Sie Sie zuerst. (Das ist, was ein bus-Fehler bedeutet in der Regel; Sie versucht haben, zu tun, einen Zugang zum Speicher, der nicht gültig ist.)(Abwechselnd, da
c
immer halten nur einen einzigen Charakter, Sie kann es erklären, wiechar c
und pass&c
zu scanf. Keine Notwendigkeit zu erklären, eine Zeichenfolge von Zeichen, wenn ein tun wird.)Sobald Sie das tun, werden Sie laufen in das Problem, dass Sie sicher, dass
content
ist lang genug, um alle halten Sie die Eingabe. Entweder müssen Sie raten, wie viel input, den Sie erwarten, und ordnen es zumindest, dass lange (und dann ein Fehler ausgegeben, wenn Sie mehr als das), oder Sie benötigen eine Strategie, um den Puffer in einer größeren Größe, wenn es nicht lange genug.Oh, und du wirst auch irgendwann das problem, dass
strcat
erwartet einen string, nicht einen einzigen Charakter. Selbst wenn Sie verlassenc
alschar*
, diescanf
nennen, macht es nicht einen string. Eine Einzel-Zeichen-string ist (im Speicher) ein-Zeichen, gefolgt durch ein null-Zeichen an das Ende der Zeichenfolge.scanf
beim Scannen für ein einzelnes Zeichen, nicht gehen, um in die null-Zeichen nach dem es. Als Ergebnisstrcpy
ist nicht zu wissen, wo das Ende der Schnur ist, und gehen Wandern ab, durch das Gedächtnis der Suche nach dem null-Zeichen.c
einechar
und mit&c
ist nicht genug, dastrcat()
muss eine null-terminierte Zeichenfolge.Seit Sie kümmern sich nicht um den eigentlichen Inhalt, warum die Mühe der Aufbau einer Schnur? Würde ich auch verwenden
getchar()
:Dieser code korrekt behandelt Fälle, in denen Sie Ihre Datei hat
'\0'
Zeichen.c
erklärt werden sollte, wieint
umfassen den Bereich derchar
plusEOF
.Das problem hier ist, dass Sie verweisen auf eine Zeiger-variable, die keinen reservierten Speicher über
malloc
, damit die Ergebnisse wären unbestimmt, und nicht allein, dass durch die Verwendungstrcat
auf einem undefinierten Zeiger werden könnte, zeigen auf etwas, Sie endete mit einem bus-Fehler!Dies wäre der Feste code erforderlich....
Den code highlights der Programmierer verantwortlich zu verwalten die Speicher - für jedes
malloc
es gibt einefree
wenn nicht, haben Sie ein Speicherleck!Edit: Dank David Gelhar für seine Punkt-bei meiner glitch! Ich habe die Feste bis Sie den code oben entsprechend die Korrekturen...natürlich in einer realen situation, die vielleicht dem festen Wert 100 verändert werden könnte, um vielleicht eine
#define
um es leicht zu erweitern, den Puffer durch die Verdoppelung über die Höhe der Speicher überrealloc
und schneiden Sie es auf Größe...Unter der Annahme, dass Sie möchten, zu bekommen (kürzer als MAXL-1 chars) strings und nicht um Ihre file char by char, ich habe Sie wie folgt vor: