2017-01-03 4 views
1

ここに私のコードです。右のキー(上向き矢印または下向き矢印)を押しているときにデフォルトのケースに達するのはなぜですか。たとえば、それを実行して矢印アップを押すと、デフォルトのケースに達し、別のキーを押すと正しいケースに達して作業します。なぜこうなった ?このスイッチでは何が起こっていますか? (C++スクロールメニュー)

#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 - "getch、wgetch、mvgetchおよびmvwgetchルーチンは、ウィンドウから文字を読み込みます。遅延なしモードでは、入力が待機していない場合、値のERRが返されます。あなたはERRを得ていますか?それが何であるかを見るために返された数値を印刷しましたか? – RyanP

+0

私はエラーになりません。私はゲッチがうまくいっていると思う。私はASCII値の問題だと思う。矢印キーには、OS上で異なるascii値があると聞きました。なぜ私は矢印を押したときに右の場合に行くのではなく、デフォルトの原因に到達しているのか分かりません。 –

+0

矢印キーで問題が発生したのは、1つではなく2バイトを入力に送信したためです。おそらくこれがここに当てはまり、どんな理由であれ、getch()は別のキー押しが第2のバイトを捕捉するのを待っています。 'c = getch()'をスイッチの前に移動して 'c = getch();のように表示するとどうなりますか? cout << c << endl;スイッチ(c){... '? – jonhopkins

答えて

3
#define KEY_UP 72 

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

72大文字H文字のASCIIです。

キーボードのカーソルアップキーを押すと、文字「H」を入力することはほとんどありません。

実際の説明は、カーソル移動キー押下は、最後の一つはHされた状態で、複数文字のコード、1文字または2文字によって以下の可能性が最も高いEscキーコードを生成することです。

私の端末では、例えば、カーソルアップはESC [A文字シーケンスを生成します。

forループは、一度に1文字ずつ読み取ります。だから当然、Escと読むと、これはdefaultコードパスで処理されます。そして、次の読み取り(または次の読み取り)でHが読み取られ、これが表示されます。

+0

ありがとうございました。 getch()関数に問題があったようですが、解決しました。あなたの時間をありがとう。 –

関連する問題