Getch与while循环结合使用会触发loopcontent两次

时间:2018-03-21 15:19:45

标签: c++ windows visual-studio-2017

我不是一个真正的程序员,所以我的知识非常有限,我只是希望得到一个非常基本的项目工作。我一直在谷歌搜索很多,从我发现我猜测它与读取空格或新线作为输入或沿着这些线的东西有关。我找到的所有解决方案似乎都没有为我解决这个问题(尽管我可能会错误地实现它们)。

这是主要功能:

while (roundNum <= 20)
{

    roundNum++;

    cout << roundNum / 2 << endl;
    arrowKey();


}

而arrowKey功能(我通过谷歌搜索发现所以我不喜欢)看起来像这样:

int arrowKey()
{
    int c = 0;
    switch ((c = _getch()))
    {
    case KEY_UP:
        cout << endl << "Up" << endl;
        break;
    case KEY_LEFT:
        cout << endl << "Left" << endl;
        break;
    case KEY_RIGHT:
        cout << endl << "Right" << endl;
        break;
    case KEY_DOWN:
        cout << endl << "Down" << endl;
        break;
    }
    return 0;
}

问题是,roundNum会读出两次,每按一次箭头键会加两次,如下所示:

 1
 1

 Up
 2
 2

 Right
 3
 3

非常感谢帮助!

1 个答案:

答案 0 :(得分:1)

问题是char只能容纳255个值。因此,为了获得更多唯一值getch,有时使用两个值来表示键代码,指令和值。例如,尝试点击F键,您会发现同样的问题。

最终,您遇到的行为是由于箭头键被调用getch两次。

要解决此问题,请检查指令是否用于箭头键,在这种情况下,箭头键的值为224。一旦您确定了正在按下的箭头键,请在第二个值中读取另一个getch的呼叫,然后您就可以找到实际的密钥。

#include <iostream>
#include <conio.h>
using namespace std;
enum KeyCodes {
    KEY_UP = 72,
    KEY_LEFT = 75,
    KEY_RIGHT = 77,
    KEY_DOWN = 80
};
int arrowKey()
{
    int c = _getch();
    if (c == 224) {
        //another value
        int key = _getch();

        switch (key)
        {
        case KEY_UP:
            cout << endl << "Up" << endl;
            break;
        case KEY_LEFT:
            cout << endl << "Left" << endl;
            break;
        case KEY_RIGHT:
            cout << endl << "Right" << endl;
            break;
        case KEY_DOWN:
            cout << endl << "Down" << endl;
            break;
        }
    }

    return 0;
}

int main() {
    int roundNum = 0;
    while (roundNum <= 20)
    {
        roundNum++;
        cout << roundNum / 2 << endl;
        arrowKey();
    }
}

还值得指出的是getch不是std库的一部分,因此可能会有一些变化。