printf druckt nicht auf Konsole

Lesezeit: 6 Minuten

Benutzeravatar von Herrn T
Herr T.

Ich fange gerade mit der C-Sprache an. Ich verwende Eclipse (juno) als IDE und installiertes CDT-Plugin. Ich habe auch mingw64 (GCC Compiler) entpackt. Ich habe ein sehr einfaches Programm geschrieben, um zu sehen, ob es funktioniert. Das ist mein Code:

#include <stdio.h>

int main()
{
    int age;
    printf("Hello, please enter your age:\n");
    scanf("%d", &age);
    printf("Your age is %d", age);
    return 0;
}

Das Problem ist, dass der Ausgabepuffer mit dem String-Wert des ersten gefüllt wird printf gibt es aber nicht an die Konsole aus. Ich muss eine Zahl eingeben, und erst dann gibt der Puffer alle Daten an die Konsole aus, sodass ich die Konsole ungefähr so ​​sehe:

1
Hello, please enter your age:
Your age is 1

anstelle dessen, was erwartet wird, nämlich:

Hello, please enter your age:
1
Your age is 1

Jetzt habe ich festgestellt, dass ich verwenden kann fflush(stdout) nach dem ersten printf aber ich denke nicht, dass diese Lösung elegant und sogar notwendig ist. Irgendwelche Ideen, wie ich das überwinden kann?

BEARBEITEN – Da ich das in meiner Universität lerne, kann ich nichts verwenden, was nicht im Kurs gelernt wurde, damit ich es kann nur verwenden printf und scanf

NEUE BEARBEITUNG – Ich glaube, ich habe eine Erklärung dafür gefunden. Wie gesagt, ich gebe in der Konsolenansicht in Eclipse aus. Das Seltsame ist, dass ich das gewünschte Ergebnis erhalte, wenn ich das Programm über die Befehlszeile von Windows kompiliere und ausführe. Daher denke ich, dass Eclipse die Ausgabe tatsächlich in eine Datei schreibt und im Konsolenfenster darstellt. Wie kann ich Eclipse dazu zwingen, ein echtes Befehlszeilenfenster in meinen Ausführungskonfigurationen zu öffnen?

  • Nebenbemerkung, an a ist nichts auszusetzen fflush()sie können sehr praktisch sein

    – Mike

    23. Oktober 2012 um 16:29 Uhr

  • Das ist ein äußerst seltsames Verhalten, das \n sollte spülen stdout

    – KevinDTimm

    23. Oktober 2012 um 16:38 Uhr

  • mögliches Duplikat von Warum wird printf nach dem Aufruf nicht geleert, es sei denn, ein Zeilenumbruch ist in der Formatzeichenfolge?

    – alk

    23. Oktober 2012 um 16:48 Uhr

  • Dies ist kein Duplikat, da ich das nicht verwenden kann fflush oder fprintf Funktionen. Wenn ich den gcc über die Befehlszeile in Windows ausführe, erhalte ich das richtige Ergebnis, daher vermute ich, dass es sich um eine falsche Eclipse-Konfiguration handelt. Irgendwelche Ideen, welche Konfigurationen?

    – Herr T.

    23. Oktober 2012 um 19:01 Uhr


kliteyns Benutzeravatar
kliteyn

Die Ausgabe wird gepuffert.

stdout ist standardmäßig zeilengepuffert, was bedeutet, dass ‘\n’ den Puffer leeren soll. Warum geht das in deinem Fall nicht? Ich weiß nicht. Ich benötige weitere Informationen zu Ihrer Anwendung/Umgebung.

Sie können die Pufferung jedoch mit setvbuf() steuern:

setvbuf(stdout, NULL, _IOLBF, 0);

Dies erzwingt, dass stdout zeilengepuffert wird.

setvbuf(stdout, NULL, _IONBF, 0);

Dadurch wird stdout ungepuffert, sodass Sie fflush() nicht verwenden müssen. Beachten Sie, dass die Anwendungsleistung stark beeinträchtigt wird, wenn Sie viele Ausdrucke haben.

  • Ich habe diese Lösung ausprobiert und festgestellt, dass Sie printf nicht im Debug-Modus ausführen können. es hängt und ich bekomme: *stopped,reason=”end-stepping-range”,frame=…

    – Jehuda

    30. Juni 2013 um 20:37 Uhr

  • Dies war die Lösung für mich. Ich konnte die Ausgabe meines Programms sehen, wenn ich es direkt in einem Terminalfenster ausführte, aber wenn ich versuchte, es zu verwenden tee oder gar die Terminalausgabe in eine Datei schreiben würde ich nichts bekommen.

    – Chris Watt

    26. August 2015 um 16:09 Uhr

  • Sie haben Recht. In meinem Fall wurde die Ausgabe gepuffert und nach Beendigung des Programms entladen, wobei alle gepufferten Zeichenfolgen, die sich während der Ausführung angesammelt haben, direkt nach Beendigung des Programms geschrieben wurden.

    – Ein weiterer

    11. November 2017 um 19:28 Uhr


Benutzeravatar von Herrn T
Herr T.

Anscheinend ist dies ein bekannter Fehler von Eclipse. Dieser Fehler wird mit der Auflösung von WONT-FIX behoben. Ich habe aber keine Ahnung warum. hier ist der Link:
Eclipse C-Konsolenfehler.

  • Immer noch nicht gelöst. Die Pufferung muss deaktiviert oder anderweitig in Ihrem Code behandelt werden.

    – Hack-R

    1. Juni 2015 um 1:32 Uhr

Kitchis Benutzeravatar
Kitchi

Sie könnten versuchen, nach stderr zu schreiben, anstatt nach stdout.

fprintf(stderr, "Hello, please enter your age\n");

Sie sollten sich auch diesen entsprechenden Thread ansehen.

  • Ich belege diesen C-Kurs an meiner Universität und weil es ein 101-Kurs ist, kann ich keine Sachen verwenden, die nicht im Material enthalten sind (ich kann vorerst nur verwenden printf und scanf). Aus dem gleichen Grund kann ich fflush nicht verwenden.

    – Herr T.

    23. Oktober 2012 um 16:42 Uhr

  • Gibst du auf eine Art Konsole aus? Ich arbeite unter Linux … also bin ich mit dem Windows-Kompilierungsverfahren usw. überhaupt nicht vertraut.

    – Kitchi

    23. Oktober 2012 um 16:49 Uhr

  • Die Konsole, von der ich spreche, ist die Konsole in der Eclipse-IDE. (Konsolenansicht) – aber wie ich in einem anderen Kommentar sagte, wenn ich über die Befehlszeile mit gcc kompiliere, erhalte ich das gewünschte Ergebnis, also vermute ich stark, dass dies ein Problem mit der Eclipse-Konfiguration ist. irgendwelche Ideen?

    – Herr T.

    23. Oktober 2012 um 20:07 Uhr

  • Manchmal, wenn der Compiler denkt, dass er an irgendeine Art von Datei und nicht an eine Konsole ausgibt, wird er den Puffer nicht leeren, bis er vollständig voll ist, selbst bei einem Zeilenumbruch. Vielleicht passiert das, da Sie über gcc bekommen, was Sie wollten.

    – Kitchi

    24. Oktober 2012 um 10:08 Uhr

  • Richtig – ist es also möglich, Eclipse zu zwingen, das C-Programm in der Windows-Befehlszeile anstelle der Konsolenansicht von Eclipse auszuführen?

    – Herr T.

    24. Oktober 2012 um 12:16 Uhr

Versuchen Sie, dies vor dem Drucken einzustellen:

setvbuf (stdout, NULL, _IONBF, 0);

Wie andere bereits betont haben, kann die Ausgabe innerhalb Ihres Programms gepuffert werden, bevor eine Konsole oder Shell die Möglichkeit hat, sie zu sehen.

Auf Unix-ähnlichen Systemen, einschließlich Macs, stdout verfügt standardmäßig über eine zeilenbasierte Pufferung. Das bedeutet, dass Ihr Programm seine leert stdout Puffer, sobald es einen Zeilenumbruch sieht.

Unter Windows sind Zeilenumbrüche jedoch keine Besonderheit mehr, und es wird eine vollständige Pufferung verwendet. Windows unterstützt überhaupt keine Zeilenpufferung; sehen die msdn-Seite auf setvbuf.

Unter Windows ist es daher ein guter Ansatz, vollständig abzuschalten stdout so puffern:

setvbuf (stdout, NULL, _IONBF, 0);

Benutzeravatar von cmd
cmd

Hinzufügen c:\gygwin\bin zu PATH Umgebungsvariable entweder als Systemumgebungsvariable oder in Ihrem Eclipse-Projekt (Eigenschaften-> Ausführen/Debuggen-> Bearbeiten)

Benutzeravatar von Spikatrix
Spikatrix

  1. Erstellen Sie in Ihrem Projektordner eine „.gdbinit“-Textdatei. Es enthält Ihre gdb-Debugger-Konfiguration
  2. Bearbeiten Sie „.gdbinit“ und fügen Sie die Zeile (ohne Anführungszeichen) hinzu: „set new-console on“
  3. Klicken Sie nach dem Erstellen des Projekts mit der rechten Maustaste auf das Projekt Debug > „Debug Configurations“, wie unten gezeigt
    Debug-Konfiguration

  4. Stellen Sie auf der Registerkarte „Debugger“ sicher, dass die „GDB-Befehlsdatei“ jetzt auf Ihre „.gdbinit“-Datei verweist. Andernfalls geben Sie den Pfad zu Ihrer „.gdbinit“-Konfigurationsdatei ein:
    Gdb-Konfiguration

  5. Klicken Sie auf „Übernehmen“ und „Debuggen“. Eine native DOS-Befehlszeile sollte wie unten gezeigt gestartet werden
    Konsole

  • Hat das jemand getestet?

    – Daniel

    16. April 2020 um 8:22 Uhr

1397500cookie-checkprintf druckt nicht auf Konsole

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy