ubuntuusers.de

Press ENTER to continue. mit gcc

Status: Gelöst | Ubuntu-Version: Ubuntu 10.04 (Lucid Lynx)
Antworten |

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:

1
2
3
4
5
6
7
8
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 Team-Icon

Avatar von 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

Avatar von 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

Avatar von 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:

1
2
3
4
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.

Antworten |