6 Stimmen

Warum funktioniert printf nicht vor einer Endlosschleife?

Ich versuche, ein kleines Programm zu erstellen, das eine Endlosschleife enthält, um auf Signaleingaben des Benutzers zu warten. Ich wollte eine Meldung über das aktuelle Arbeitsverzeichnis ausgeben, bevor ich die Endlosschleife beginne. Die Meldung funktioniert von selbst, aber wenn ich die Endlosschleife in den Code einfüge, wird die Meldung nicht ausgedruckt (aber das Terminal macht eine Endlosschleife). Der Code lautet:

#include <stdio.h>

int MAX_PATH_LENGTH = 100;

main () {
  char path[MAX_PATH_LENGTH];
  getcwd(path, MAX_PATH_LENGTH);
  printf("%s> ", path);
  while(1) { }
}

Wenn ich die while(1) { } Ich erhalte die Ausgabe:

ad@ubuntu:~/Documents$ ./a.out
/home/ad/Documents>

Warum ist das so? Ich danke Ihnen!

9voto

David Z Punkte 121773

電話をかけるとき printf wird die Ausgabe nicht sofort gedruckt, sondern irgendwo hinter den Kulissen in einem Puffer abgelegt. Damit sie tatsächlich auf dem Bildschirm erscheint, müssen Sie fflush oder etwas Gleichwertiges, um den Stream zu spülen. Dies geschieht automatisch, wenn Sie ein Zeilenumbruchzeichen* ausgeben und wenn das Programm beendet wird; im zweiten Fall wird die Zeichenkette angezeigt, wenn Sie die Endlosschleife entfernen. Aber mit der Schleife endet das Programm nie, also wird die Ausgabe nie auf den Bildschirm gespült und Sie sehen nichts.


*Wie ich gerade beim Lesen der Frage entdeckt habe, die itsmatt in einem Kommentar verlinkt hat, passiert das Flush-on-Newline nur, wenn das Programm in ein Terminal druckt, und nicht unbedingt, wenn es in eine Datei druckt.

3voto

Oliver Charlesworth Punkte 259497

Denn Sie haben keinen Zeilenumbruch am Ende der Zeichenfolge. stdout es zeilengepuffert standardmäßig, d.h. es wird erst dann in die Konsole gespült, wenn ein Zeilenumbruchzeichen ( '\n' ), oder bis Sie es explizit mit fflush() .

2voto

flight Punkte 7091

Vielleicht wird die Ausgabe nicht gespült. Versuchen Sie es:

printf("%s> ", path);
fflush(stdout);

1voto

Daniel A. White Punkte 180762

Weil der stdout nicht geleert wurde.

Rufen Sie an.

fflush(stdout);

vor Ihrer Schleife.

1voto

John Yang Punkte 1280

Denn die Ausgabe wird nicht gespült. hinzufügen

fflush(stdout); 

vor der while-Schleife wird das Problem gelöst.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X