2017-01-03 4 views
1

Hier ist mein Code. Warum der Standardfall erreicht wird, wenn ich die richtigen Tasten drücke (Pfeil nach oben oder Pfeil nach unten). Wenn ich es zum Beispiel benutze und die Pfeiltaste nach oben drücke, erreicht es den Standardfall, und wenn ich die Taste ein anderes Mal drücke, erreicht ich den richtigen Fall und arbeite. Warum passiert dies ?Was passiert in diesem Schalter? (C++ Scrollmenü)

#include <conio.h> 
#include <iostream> 
#include <windows.h> 
using namespace std; 

#define KEY_UP 72 
#define KEY_DOWN 80 
#define KEY_LEFT 75 
#define KEY_RIGHT 77 
#define KEY_RETURN 13 

void admin_login() 
{ 
    system("cls"); 
    std::string username, password; 
    /*gotoxy(console::width/2-10,console::height/2-3);*/ 
    std::cout << "\nUsername: "; 
    std::cin >> username; 
    std::cout << "\nPassword: "; 
    std::cin >> password; 
} 

int main() 
{ 
    int c = 0; 
    int line = 0; 
    std::string menu_line[] = { "Admin login", "Guest login", "Change color theme", "Exit" }; 

    while(1) 
    { 
     system("cls"); 

     for(int i = 0 ; i < 4 ; i++) 
     { 
      if(i == line) 
       SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),12); 
      else 
       SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),15); 

      std::cout << menu_line[i] << '\n'; 
     } 


     switch((c=getch())) 
     { 
      case KEY_UP: 
       --line; 
       if(line == -1) 
        line = 3; 
       break; 
      case KEY_DOWN: 
       ++line; 
       if(line == 4) 
        line = 0; 
       break; 
      case KEY_RETURN: 
       switch(line) 
       { 
        case 0: 
        system("cls"); 
        admin_login(); 
        break; 
       } 
       break; 
      default: 
       cout << endl << "null" << endl; // not arrow 
       system("pause"); 
       break; 
     } 
} 

return 0; 
} 
+0

https://linux.die.net/man/3/getch - "Die Routinen getch, wgetch, mvgetch und mvwgetch, lesen ein Zeichen aus dem Fenster. Wenn im No-Delay-Modus keine Eingabe erfolgt, wird die Wert ERR wird zurückgegeben. " Erhalten Sie ERR? Haben Sie den zurückgegebenen numerischen Wert ausgedruckt, um zu sehen, was es ist? – RyanP

+0

Ich bekomme keinen Fehler. Ich denke, getch funktioniert gut. Ich denke, ist ein Problem mit den ASCII-Werten. Ich habe gehört, dass Pfeiltasten abhängig vom Betriebssystem unterschiedliche Ascii-Werte haben. Ich verstehe nicht, warum die Standardursache erreicht wird, statt nach rechts zu gehen, wenn ich die Pfeile drücke. –

+0

Ich erinnere mich daran, dass ich ein Problem mit den Pfeiltasten hatte, wo es war, weil sie zwei Bytes an den Eingang senden und nicht nur einen. Vielleicht ist das hier der Fall und aus irgendeinem Grund wartet der getch() auf einen weiteren Tastendruck, um das zweite Byte zu erfassen. Was erhalten Sie, wenn Sie 'c = getch()' vor den Schalter bewegen und ausdrucken, wie 'c = getch(); cout << c << endl; Schalter (c) {... '? – jonhopkins

Antwort

3
#define KEY_UP 72 

     switch((c=getch())) 
     { 
      case KEY_UP: 

72 ist der ASCII für Groß H Charakter.

Es ist sehr unwahrscheinlich, dass beim Drücken der Cursortaste auf der Tastatur der Buchstabe H eingegeben wird.

Die tatsächliche Erklärung ist, dass eine Cursor-Bewegung keypress eine Mehrzeichencode erzeugt, höchstwahrscheinlich einen Esc Code gefolgt von einem oder zwei Zeichen, wobei die letzte zu sein H.

Auf meinem Terminal zum Beispiel, Cursor-up erzeugt die ESC [A Zeichenfolge.

Ihre for-Schleife liest jeweils ein einzelnes Zeichen. So, natürlich, wenn es Esc liest, wird dies von der default Code-Pfad behandelt. Und beim nächsten Lesen (oder dem folgenden) wird H gelesen, und dies sind die Ergebnisse, die Sie sehen.

+0

Danke. Es scheint, dass ich ein Problem mit der Funktion getch() hatte, aber ich habe es gelöst. Vielen Dank für Ihre Zeit. –