Getch不断输出相同的值

时间:2019-11-26 14:39:12

标签: c++

我正在构建一个小型c ++程序,并尝试使用与电池记录器批处理程序的选项主页中所示的功能相同的功能。这是我正在使用的两个代码。

battery-logger.bat

@echo off
SET choice="none"
:USER_SELECTER
    CLS
    ECHO ===============================================================
    ECHO Battery logger                            
    ECHO ===============================================================
    ECHO Selected option: %choice%
    Choice /C codq /N /M "[C]reate power log | [O]pen report | [D]elete log | [Q]uit"
    set choice=%errorlevel%
    If ErrorLevel 4 GoTo :EOF IN CPP FILE THIS THE HYPOTHETICAL ARROW LEFT TO RETURN TO PREVIOUS MENU
    If ErrorLevel 3 GoTo :C
    If ErrorLevel 2 GoTo :B
    If ErrorLevel 1 GoTo :A
    PAUSE
GoTo :USER_SELECTER
:C
ECHO DELETE IN CPP FILE THIS THE HYPOTHETICAL ARROW DOWN
GoTo :USER_SELECTER
:B
ECHO OPEN IN CPP FILE THIS REASSEMBLES ARROW RIGHT
GoTo :USER_SELECTER
:A
ECHO CREATE IN CPP FILE THIS THE HYPOTHETICAL ARROW UP
GoTo :USER_SELECTER

MENU.CPP

#include <iostream>    //required for all platforms
#include <stdio.h>     //linux/windows compatible
#include <stdlib.h>    //linux/windows compatiblE
#define KEY_UP 72      //windows compatible
#define KEY_DOWN 80    //windows compatible
#define KEY_LEFT 75    //windows compatible
#define KEY_RIGHT 77   //windows compatible
using namespace std;//required for all platforms
//test code
int TEST(){
    char c = 0;
    while(1){
        c=getch();
        switch(c){
            case KEY_UP: card='u';break;
            case KEY_DOWN: card='d';break;
            case KEY_LEFT: card='b';break;
            case KEY_RIGHT: card='f';break;
            default: card='p';break;//any non arrow key
        }
    }
    return c;
    }
} 
int main(){
    char a;
    while(1){
        a=TEST();
        cout<<a;
    }
}

控制台:      ������������� ������...

我正在寻找诸如a d b v s z...

之类的东西

1 个答案:

答案 0 :(得分:1)

好的,我不在Windows上,所以我不能使用getch,但是可以使用getchar()。我玩了一点。这是我的最终版本:

#include <iostream>    //required for all platforms
#include <stdio.h>     //linux/windows compatible
#include <stdlib.h>    //linux/windows compatible

using namespace std;//required for all platforms


char TEST() {
    char c = getchar();
    return c;
}

int main(int argc, char **argv) {
    char c;
    while(1) {
        c= TEST();
        cout << c << endl;
    }
}

与代码不同的地方,除了切换为使用getchar()使其可以在Ubuntu下编译...

我用字符代替整数。

我在提示中添加了一个“ endl”,因此更具可读性。

当我在上面的代码中使用chars并键入abcd时,它会打印abcd(由于endl,每行单独显示)。

如果我将其切换为使用整数,则它将执行以下操作:

^ g++ x.cpp -o x && x
abcd
97
98
99
100
10
-1

第一行是编译并运行。第二个是我输入abcd(返回)。 97是a的ASCII码。 (等等)。 10是换行符。 -1是我接下来输入的Ctrl-D(输入的结尾)。

请注意,您的代码还有其他问题。 Main是拼写的maint。错了然后您在cout中更改了变量名。因此,您的代码实际上不会在没有修复的情况下运行。

部分问题可能是在整数和字符之间来回转换,但是由于您显然没有按编写的顺序实际运行代码,因此我不确定这是否在做。

请注意,getch()可能返回键码。您不应该将数据从int转换为char。您需要进一步了解getch()的工作方式。也许Windows程序员会获得更多信息。

或者也许只是您来回转换数据。也许我的代码有帮助。