Ich habe versucht, einen vollständigen Line-Eingang in C zu nehmen Anfänge tat ich,Wie nehme ich eine Zeileneingabe in C?
char line[100] // assume no line is longer than 100 letters.
scanf("%s", line);
Ignorieren Sicherheitslücken und Buffer Overflows, wusste ich, das nie mehr als ein Worteingabe übernehmen könnte. Ich modifizierte es wieder,
scanf("[^\n]", line);
Dies konnte natürlich nicht mehr als eine Zeile der Eingabe nehmen. Der folgende Code ausgeführt wurde jedoch in Endlosschleife,
while(fscanf(stdin, "%[^\n]", line) != EOF)
{
printf("%s\n", line);
}
Das lag daran wurde die \n
nie verbraucht, und an der gleichen Stelle wiederholt stoppen würde und hatte den gleichen Wert in line
. So schrieb ich den Code wie
while(fscanf(stdin, "%[^\n]\n", line) != EOF)
{
printf("%s\n", line);
}
Dieser Code arbeitete tadellos (oder so dachte ich), für die Eingabe aus einer Datei. Aber für die Eingabe von stdin
erzeugte dies kryptisches, seltsames, unartikuliertes Verhalten. Erst nachdem die zweite Zeile eingegeben wurde, würde die erste Zeile gedruckt werden. Ich kann nicht verstehen, was wirklich passiert.
Alles, was ich tue, ist dies. Notieren Sie sich die Zeichenfolge, bis Sie auf eine \n
stoßen, speichern Sie sie in line
, und verwenden Sie dann die \n
aus dem Eingabepuffer. Drucken Sie jetzt diese line
und machen Sie sich bereit für die nächste Zeile von der Eingabe. Oder werde ich in die Irre geführt?
Zu der Zeit jedoch, diese Frage der Entsendung, fand ich eine bessere Alternative,
while(fscanf(stdin, "%[^\n]%*c", line) != EOF)
{
printf("%s\n", line);
}
Dieses einwandfrei für alle Fälle funktioniert. Aber meine Frage bleibt noch. Wie dieser Code kommen,
while(fscanf(stdin, "%[^\n]\n", line) != EOF)
{
printf("%s\n", line);
}
arbeiteten für Eingaben aus einer Datei, sondern verursachen Probleme für die Eingabe von der Standardeingabe?
Verwenden Sie fgets(), nicht fscanf(). – FredK
könnte ich sehr sicher tun. Aber das ist wie vor dem Problem weglaufen. Dies ist zu verstehen, das Verhalten von 'scanf' –
Ich werde für' fgets' auch gehen - nicht vergessen, es behält jede nachfolgende 'newline'. Wie für die 'scanf'-Familie, überprüfe immer die korrekte * Anzahl der konvertierten Elemente *. Umgewandelte '0'-Elemente werden nicht durch' EOF'-Test erkannt, aber 'EOF' wird angezeigt, wenn die korrekte Anzahl von Elementen nicht konvertiert wurde. –