ANSI-C - wie von stdin Lesen, Wort für Wort?
Code:
#include <stdio.h>
int main(void) {
char i[50];
while(scanf("%s ", i)){
printf("You've written: %s \n", i);
}
printf("you have finished writing\n");
return 0;
}
Ein problem ist, dass der code nicht tun, weil es erwartet wird. Wenn ich tippte in:
abc def ghi.
Wäre es-Ausgang:
You've written: abc
You've written: def
Wie kann ich es beheben? Das Ziel ist, Lesen jedes einzelne Wort von stdin, bis es erreicht "ENTER" oder ein "." (Punkt).
- Was über das schreiben
scanf("%s")
einmal, dann ruftscanf(" %s")
in der Schleife? - Abgesehen von dem problem, nutzen Sie bitte
scanf("%49s ", i)
in dieser Instanz zu sein in der Gewohnheit der Verhinderung von buffer-overruns. 'K? - Danke, aber Sie hat das problem nicht behoben. Die Sache ist die while-Schleife endet vor dem erreichen der letzten Gruppe von Zeichen, und das ist nicht das, was es tun soll.
Du musst angemeldet sein, um einen Kommentar abzugeben.
@cnicutar ist ziemlich nah, aber Sie offensichtlich nur wollen, um es zu Lesen auf etwas anderes als Leerzeichen und nicht mehr Lesen möchten, ein einzelnes Wort, wenn man auf Leerzeichen, also für Sie scanset, möchten Sie wahrscheinlich so etwas wie:
In diesem, dem ersten Raum springt über alle führenden Leerzeichen. Die scan-stellen dann liest, bis es zu einem Leerzeichen, Tabulator, neue-Zeile oder Zeitraum. Die %*c liest dann (aber wirft Sie Weg) das nächste Zeichen (normalerweise der, der beendet die Suche).
Diese können jedoch wegwerfen, ein Zeichen, wenn Sie/, wenn Sie erreichen das Ende des Puffers, so dass Sie möglicherweise verwenden möchten, %c, und geben Sie einen Charakter zu Lesen in statt. Lassen Sie erholen sich von einer einzelnes Wort länger ist als der Puffer, die Sie angegeben.
Wie etwa:
Oder sowas.
scanset
imfscanf
manual-Seite.Graben
scanf
insgesamt und gehen Sie mitfgets
:mit den folgenden Vorsichtsmaßnahmen:
Wenn es Raum in den Ziel-Puffer
fgets
speichern wird der trailing newline als Teil der Eingabe;Wenn Sie mehr Lesen möchten, auf der Suche nach einem
.
, müssen Sie einige Logik zu suchen, es in der input-string wie den folgenden:Der einfachste Weg, dies zu tun ist mit flex. Anderenfalls sind Sie zu wiederholen eine Reihe von schwierigen, komplexen Arbeit, und Sie sind wahrscheinlich, Fehler zu machen.
Lesen Sie auch lex und yacc, 2nd edition.