Ich fange gerade an, mich mit der Sprache C zu beschäftigen. Ich verwende Eclipse (Juno) als IDE und habe das CDT-Plugin installiert. Ich habe auch mingw64 (GCC Compiler) entpackt. Ich habe ein sehr einfaches Programm geschrieben, um zu sehen, ob es funktioniert. Dies 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 printf
gefüllt wird, aber ihn nicht auf die Konsole ausgibt. Ich muss eine Zahl eingeben, und erst dann gibt der Puffer alle Daten an die Konsole aus, so dass ich auf der Konsole etwas wie das hier sehe:
1
Hello, please enter your age:
Your age is 1
anstelle des erwarteten Ergebnisses, nämlich:
Hello, please enter your age:
1
Your age is 1
Nun, ich habe herausgefunden, dass ich fflush(stdout)
nach dem ersten printf
verwenden kann, aber ich glaube nicht, dass diese Lösung elegant und sogar notwendig ist. Hat jemand eine Idee, wie ich das Problem lösen kann?
EDIT - da ich dies in meiner Universität lerne, kann ich nichts verwenden, was nicht im Kurs gelernt wurde, also kann ich nur printf
und scanf
verwenden
NEUE BEARBEITUNG - Ich glaube, ich habe eine Erklärung für dieses Problem gefunden. Wie ich schon sagte, gebe ich in der Konsolenansicht in Eclipse aus. Das Seltsame ist, dass ich das gewünschte Ergebnis erhalte, wenn ich das Programm kompiliere und von der Windows-Befehlszeile aus ausführe. Daher denke ich, dass Eclipse die Ausgabe tatsächlich in eine Datei schreibt und im Konsolenfenster anzeigt. Wie kann ich eclipse zwingen, ein echtes Kommandozeilenfenster in meinen Startkonfigurationen zu öffnen?
Die Ausgabe wird gepuffert.
stdout ist standardmäßig zeilengepuffert, was bedeutet, dass '\n' den Puffer leeren soll. Warum geschieht das in Ihrem Fall nicht? Ich weiß es nicht. Ich brauche mehr Informationen über Ihre Anwendung/Umgebung.
Sie können jedoch die Pufferung mit setvbuf() steuern:
setvbuf(stdout, NULL, _IOLBF, 0);
Dies zwingt stdout, zeilengepuffert zu sein.
setvbuf(stdout, NULL, _IONBF, 0);
Dies erzwingt, dass stdout ungepuffert ist, so dass Sie fflush() nicht verwenden müssen. Beachten Sie, dass dies die Leistung der Anwendung stark beeinträchtigen wird, wenn Sie viele Ausdrucke haben.
Versuchen Sie, diese Einstellung vor dem Drucken vorzunehmen:
setvbuf (stdout, NULL, _IONBF, 0);
Sie könnten versuchen, in stderr statt in stdout zu schreiben.
fprintf(stderr, "Hello, please enter your age\n");
Sie sollten auch einen Blick auf diesen entsprechenden Thread werfen.