wewa
Anmeldungsdatum: 14. September 2008
Beiträge: 168
Wohnort: Österreich
|
Hallo! Ich habe ein kleines Problem.
Ich benutze die Code::Blocks IDE und den gcc'-Compiler. Und ich möchte die "Funktion" Press ENTER to continue
realisieren.
Doch ich bekomme das einfach nicht hin. Hier meine Funktion:
| void wait()
{
char c;
printf("Press ENTER to continue.");
fflush(stdin);
fflush(stdout);
scanf("%c",&c); //auch c=getchar(); funktioniert nicht
}
|
Hier wird einfach nicht auf eine Eingabe gewartet. Auch scanf(" %c",&c); (mit Leerzeichen vor %c) liefert nicht das gewünschte Ergebnis, da man hier zuerst ein Zeichen eingeben muss. Und ich möchte aber gleich mit ENTER weiter. Kann mir da jemand weiterhelfen? lg wewa
|
stfischr
Anmeldungsdatum: 1. März 2007
Beiträge: 19197
|
Hi. fflush ist nur für den Output. Scanf ist die schlechteste Methode um Userinput zu lesen. Such einfach mal mit google nach scanf und linux, da wirst du mit Lösungen überschwemmt.
|
wewa
(Themenstarter)
Anmeldungsdatum: 14. September 2008
Beiträge: 168
Wohnort: Österreich
|
Hallo! Danke für deine Antwort. Habe auch getchar(); ausprobiert. Hat aber auch nicht funktioniert.
Ich bin nun auf eine funktionierende Lösung gestoßen. 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25 | #include <stdio.h>
#include <stdlib.h>
#include <termios.h>
#include <unistd.h>
void wait()
{
printf("Press any button to continue. ");
getchar(); //Zum Leeren des Puffers ... nur nötig, wenn zuvor scanf() verwendet wurde :(
mygetch();
}
int mygetch()
{
struct termios oldt,
newt;
int ch;
tcgetattr( STDIN_FILENO, &oldt );
newt = oldt;
newt.c_lflag &= ~( ICANON | ECHO );
tcsetattr( STDIN_FILENO, TCSANOW, &newt );
ch = getchar();
tcsetattr( STDIN_FILENO, TCSANOW, &oldt );
return ch;
}
|
Einfach wait(); aufrufen und es funktioniert.
Eine andere Möglichkeit wäre, einfach 2x getchar() aufzurufen (mit dem 1. getchar() wird der Puffer geleert). Das ist aber nicht gerade eine schöne Lösung. Gibt es da nichts Besseres um den Puffer zu leeren?
|
wewa
(Themenstarter)
Anmeldungsdatum: 14. September 2008
Beiträge: 168
Wohnort: Österreich
|
stfischr schrieb: ... Scanf ist die schlechteste Methode um Userinput zu lesen
Du hast Recht. Der Fehler tritt nur auf, wenn zuvor scanf() verwendet wurde. Gibt es für scanf() eine bessere Alternative?
|
linopolus
Anmeldungsdatum: 21. Juli 2008
Beiträge: 986
Wohnort: Ottendorf-Okrilla
|
Es wäre noch hilfreich, wenn du sagst ob du in C oder in C++ arbeitest. In C++ gäbe es nämlich weitere fortgeschrittene Methoden, um Dinge auszugeben und einzulesen als printf und scanf und getchar usw. Wenn ich mich recht erinnere war Code::Blocks doch eine C++ IDE oder?
|
wewa
(Themenstarter)
Anmeldungsdatum: 14. September 2008
Beiträge: 168
Wohnort: Österreich
|
Oh, tschuldigung ... habe ich wohl vergessen. Ich arbeite natürlich in C. Zu Code::Blocks: Es kann C als auch C++ (aber im Endeffekt ist das ja vom Compiler abhängig).
|
linopolus
Anmeldungsdatum: 21. Juli 2008
Beiträge: 986
Wohnort: Ottendorf-Okrilla
|
Ich kann zwar nicht verstehen, warum man noch mit C arbeiten will, wenn man es nicht muss (es gibt so viele angenehmere, C basierende Sprachen:)), aber gut. Ich habe (kenne mich eigentlich nur mit C++ und C# aus, daher wahrscheinlich relativ Q&D), mich mal kurz hingesetzt und was geschrieben. Scheint soweit zu funktionieren. 1
2
3
4
5
6
7
8
9
10
11
12
13
14 | #include <stdio.h>
void wait()
{
printf("Press any key to continue..\n");
getchar();
}
int main()
{
printf("I'm doing something useless..\n");
wait();
printf("Done!\n");
return 0;
}
|
Und wenn man beim printf() in wait() das \n weglässt, hat man nichteinmal eine Leerzeile.
|
wewa
(Themenstarter)
Anmeldungsdatum: 14. September 2008
Beiträge: 168
Wohnort: Österreich
|
getchar() macht meines Wissens Probleme, wenn man zuvor Dinge mit scanf() eingelesen oder printf() ausgegeben hat. Anscheinend werden gewisse Zeichen nicht aus dem Puffer gelöscht.
fflush() hat da aug nicht geholfen. Wie kann man verhindern, das getchar() vorhandene Zeichen einliest, oder wie kann man den Puffer wirklich leeren?
|
Lunar
Anmeldungsdatum: 17. März 2006
Beiträge: 5792
|
printf() hat damit nichts zu tun, Aus- und Eingabe haben getrennte Puffer. getchar() führt nur dann nicht zum gewünschten Effekt, wenn Daten im Eingabepuffer vorhanden sind, also z.B. nach einer unvollständig gelesenen Eingabe (eben vor allem durch scanff() und Konsorten), oder weil der Benutzer zu viel eingegeben hat.
Den Eingabepuffer vollständig zu leeren, ist in Standard-C unmöglich. Es gibt allenfalls verschiedene nicht standardisierte Erweiterungen, z.B __fpurge() in der glibc. Du musst den Puffer manuell durch Lesen aller verbleibenden Zeichen leeren:
| while ((c = getchar()) != EOF) {}
printf("Press enter to continue ...");
fflush(stdout);
getchar();
|
|
wewa
(Themenstarter)
Anmeldungsdatum: 14. September 2008
Beiträge: 168
Wohnort: Österreich
|
ah danke! Mit _fpurge(stdin) funktioniert es.
|