printf () druckt einen String ohne Zeilenumbruch im Zeilenpuffermodus nach scanf ()

8

Ich bin mir bewusst, dass die meisten Terminals standardmäßig im Zeilenpuffermodus sind. h., die Ausgabe wird gepuffert und nicht auf stdout gerichtet, bis ein neues Zeilenzeichen angetroffen wird.

Ich würde also erwarten, dass nichts gedruckt wird (zumindest bevor der Puffer voll ist):

%Vor%

Es druckt tatsächlich für eine kurze Zeit nichts.

Wenn ich jede Sekunde "Haha" drucken möchte, kann ich entweder printf("Haha\n") oder fflush(stdout) nach dem Druck machen. (Ich weiß, das ist nicht so tragbar, aber es ist trotzdem eine Lösung)

Nun erinnere ich mich an das sehr klassische scanf-Programm (mit meiner Hinzufügung zur while (1) -Schleife, um Pufferspülung beim Programm-Exit zu verhindern):

%Vor%

Jetzt druckt das Programm Haha. Input sth here: (und warte auf meine Eingabe). Es ist nicht hier, wenn ich die scanf-Anweisung entferne. Warum ist das so?

Danke.

    
Chung Lun Yuen 15.09.2016, 04:34
quelle

1 Antwort

3
  

Jetzt druckt das Programm Haha. Input sth here: (und warte auf meine Eingabe). Es ist nicht hier, wenn ich die scanf-Anweisung entferne. Warum ist das so?

Weil der Standard ( N1570 .. "fast C11") ) sagt so, §5.1.2.3 / 6 (Hervorhebung von mir):

  

Die geringsten Anforderungen an eine konforme Implementierung sind:

     

[..]

     
  • Die Eingabe- und Ausgabedynamik interaktiver Geräte muss gemäß 7.21.3 erfolgen. Die Absicht dieser Anforderungen besteht darin, dass ungepufferte oder zeilengepufferte Ausgaben so bald wie möglich angezeigt werden, damit sichergestellt wird, dass Aufforderungsmeldungen tatsächlich angezeigt werden, bevor ein Programm auf die Eingabe wartet .
  •   

[..]

Auch wenn Ihre Ausgabe keine neue Zeile enthält und an eine Zeile gepuffert wird stdout , muss erscheinen, bevor Ihr Programm auf Eingabe warten darf. Dies liegt daran, dass stdout und stdin mit einem Terminal verbunden sind und daher ( Achtung: Dies ist die Implementierung definiert! ) ist, was der Standard "interaktive Geräte" nennt.

    
Daniel Jour 15.09.2016, 08:02
quelle

Tags und Links