Getch funktioniert nicht :(



  • Hallo,

    ich habe eigentlich ein simples kleines Testprogramm geschrieben,
    aber es funktioniert nicht recht.

    Sinn (Naja Sinn ist relative bei dem Programm^^)
    Naja aufjedenfall soll beim Starten der Text "Eingabe " ausgeben werden.
    Dannach soll man eine Zahl eintippen.

    Dann soll je nach Eingabe die passende If - Abfrage ausgeführt werden.

    Code

    int x = getch();
    
        cout << "Eingabe " << endl;
    
        cin >> x;
    
        if( x == 49 ) 
         cout << "1 \n";
    
        if ( x == 50 ) 
         cout << "2 \n";
    
        else 
         cout << "Default \n";
    
        system("PAUSE");
        return EXIT_SUCCESS;
    

    So nun ist es z.B. so das beim Start erstmal NIx zusehen ist, dann muss ich eine Taste drücken und dann kommt erst meine Ausgabe "Eingabe ".

    Wenn ich meine Variable x hinter dem ersten Cout Positioniere also

    cout << "Eingabe " << endl;
        int x = getch();
        cin >> x;
    

    Dann kommt zwar erst mein "Eingabe " dannach muss ich aber nochmal ne Taste drücken und dann nochmal damit die Eingabe akzeptiert wird.

    (Wieso ist das so, er darf das Getch doch vorher garnicht ausführn das ist doch ne Variable O.o)

    Nungut aufjedenfall Tipp ich "1" ein (ASCII 49) springt er in Default
    Tipp ich "2" ein (ASCII 50) springt er in Default.

    Ich versteh nicht warum er immer in DEfault springt und nicht in die passene If-Abfrage 😞

    könnt ihr mir noob da mal eben helfen ?!



  • DeJiong schrieb:

    So nun ist es z.B. so das beim Start erstmal NIx zusehen ist, dann muss ich eine Taste drücken und dann kommt erst meine Ausgabe "Eingabe ".

    Klar, denn davor steht ja auch die 'getch'-Anweisung.

    Dann kommt zwar erst mein "Eingabe " dannach muss ich aber nochmal ne Taste drücken und dann nochmal damit die Eingabe akzeptiert wird.

    Klar, denn dann hast Du ja zwei Eingaben da stehen, einmal die per 'getch' und einmal die per 'cin'.

    (Wieso ist das so, er darf das Getch doch vorher garnicht ausführn das ist doch ne Variable O.o)

    Nein, 'getch()' ist keine Variable, wie kommst Du darauf?

    Nungut aufjedenfall Tipp ich "1" ein (ASCII 49) springt er in Default
    Tipp ich "2" ein (ASCII 50) springt er in Default.

    Ich versteh nicht warum er immer in DEfault springt und nicht in die passene If-Abfrage 😞

    Da ist keine passende If-Abfrage. Welchen ASCII-Code die Zeichen haben, ist hier vollkommen irrelevant, denn Du liest kein Zeichen ein, sondern eine Zahl (ein 'int').

    Daher ist folgender Code korrekt:

    cout << "Eingabe: " << endl;
    
    int x;
    cin >> x;
    
    if (x == 1)
        cout << "1" << endl;
    else if (x == 2)
        cout << "2" << endl;
    else
        cout << "Default" << endl;
    


  • Hi,

    danke, da hab ich wohl einiges durcheinander geworfen.
    Aber nochmal kurz

    So nun ist es z.B. so das beim Start erstmal NIx zusehen ist, dann muss ich eine Taste drücken und dann kommt erst meine Ausgabe "Eingabe ".

    Klar, denn davor steht ja auch die 'getch'-Anweisung.

    Nunja, das Getch steht ja nicht einfach so davor, dass hab ich ja in eine Variable gepackt, dass dürfte doch ergo garnicht ausgeführt werden oder ? (Desshalb auch getch=Variable, war falsch ausgedrückt, ich meine ich hab ja Getch in eine Varaible gepackt).

    Wie müsste der Code denn ausehen, wenn ich das mit Getch lösen will ?!

    Danke dir trotzdem für den richtigen Code 🙂



  • Das getch() wird ausgeführt weil du die variable direkt deklarierst un definierst dann wartet dein programm auf genau diese defination(also die eingabe des getch() )

    korrigiert mich wenn ich das falsch verstanden habe 😉

    Wie du das mit getch() richtig lösen kannst kann ich dir nich sagen soweit bin ich noch nich *g*

    Mfg Sebbo



  • int x=getch();
    Das plaziert nicht getch() in die Variable x. getch() ist eine Funktion. Diese wird aufgerufen und gibt ihren Rueckgabewert dann an x weiter.

    Falls dir Funktionen unbekannt sind -> Tutorial weitermachen, kommt bestimmt bald.



  • DeJiong schrieb:

    cout << "Eingabe " << endl;
        int x = getch();
        cin >> x;
    

    Erstens liest du die Eingabe doppelt ein (zunächst als ASCII-Zeichen per getch(), danach nochmal über cin>>x (das überschreibt die ursprüngliche Initialisierung. Zweitens parst cin>>x deine Eingabe als int-Wert (und wartet darauf, daß du sie mit ENTER abschließt), so daß nach dieser Anweisung nicht 49 bzw. 50 in x steht, sondern 1 bzw. 2 (oder eventuell auch etwas anderes, wenn getch() das empfangene Zeichen aus cin's Puffer gezogen hat).

    Wenn du wirklich mit getch() einlesen willst, mußt du das "cin>>x" weglassen:

    cout<<"Eingabe:"<<endl;
    int x=getch();
    if(x==49)
      cout<<"1\n";
    else if(x==50)
      cout<<"2\n";
    else
      cout<<"Default\n";
    

    PS: Schonmal über switch() nachgedacht?



  • Die Lösung (portable getch-Impementierung): klick mich



  • Und auch wenn du die ASCII-Codes so fein rausgesucht hast, die gleiche Funktionalität aber bessere Lesbarkeit erhältst du so:

    cout<<"Eingabe:"<<endl;
    int x=getch();
    if(x=='1')
      cout<<"1\n";
    else if(x=='2')
      cout<<"2\n";
    else
      cout<<"Default\n";
    

    '1' und '2' usw werden dann automatisch in die richtigen ASCII-Codes umgewandelt 🙂

    Und nur eine Frage am Range: Wie hast du dir das eigentlich vorgestellt, "getchar" in eine Variable zu packen? Wolltest du das dann bei Gelegenheit wieder auspacken oder wie? 🤡


Anmelden zum Antworten