繁体   English   中英

getch()并将常规键与箭头键混合

[英]getch() and mixing regular keys with arrow keys

我无法在控制台上显示文本,也无法正确保存。 我有箭头键,输入,退格键和escpe工作。

我还没有真正得到的另一个/ small /错误是当我按esc并且它从空白中退出时,我被定向到了这段代码

#endif  /* defined (_M_IX86) || defined (_M_X64) */
        __fastfail(FAST_FAIL_STACK_COOKIE_CHECK_FAILURE);

在gc_report.c里面,我没有找到太多的信息(或者至少与我的问题有关)。

#define KEY_UP 72
#define KEY_DOWN 80
#define KEY_LEFT 75
#define KEY_RIGHT 77
#define KEY_ENTER 13
#define KEY_BACKSPACE 8
#define KEY_ESCAPE 27

void texteditor(int x, int y,int kolommen,char textarr[20][20],int rijen=20)
{
    int index = 0, indey = 0, keuze,lol = 20;
    do{
        gotoxy(index + x, indey + y); 
        keuze = 0;
        keuze = _getch();
        if (keuze == 0 || keuze == 0xE0 || keuze == 224)
        {
            keuze = _getch();
            gotoxy(index + x, indey + y);
            switch (keuze)
            {
            case KEY_UP:indey--;
                break;
            case KEY_LEFT: index--;
                break;
            case KEY_DOWN:indey++;
                break;
            case KEY_RIGHT: index++;
                break;
            }
            indey = (indey <= 0) ? 0 : (indey > kolommen) ? kolommen : indey;
            index = (index <= 0) ? 0 : (index > rijen) ? rijen : index;
        }
            if (keuze == 32 || (keuze >= 46 && keuze <= 57) || (keuze <= 64 && keuze >= 126))
            {
                textarr[index][indey] = (char)keuze;
                std::cout << textarr[index][indey];
                index++;
                index = (index <= 0) ? 0 : (index > rijen) ? rijen : index;
            }
            if (keuze == KEY_BACKSPACE)
            {
                index = index--;
                gotoxy(index + x, indey + y);
                std::cout << " ";
                index = (index <= 0) ? 0 : (index > rijen) ? rijen : index;
            }
            if (keuze == KEY_ENTER)
            {
                index = 0;
                indey++;
                indey =(indey >= kolommen) ? kolommen : indey++;
            }       
    } while (keuze != KEY_ESCAPE);}

我还搜索了一些箭头键后面的值,发现其中的37(左箭头),38(上箭头),39(右箭头),40(下箭头)为ASCII值,那么与我的有什么区别? ?

顾名思义,ASCII字符集描述的是字符集,而不是键盘上的键。 因此,ASCII中没有箭头键的值。

而是您正在使用的_getch()函数返回224E0h )或0来指示后面的内容是按键扫描代码。 您用于这些值是正确的,您可以在此处查找它们。

您找到的其他值(37-40)被称为虚拟键,并且更为常见。 例如,它们是用Javascript返回的event.keyCode ,也可以在WinApi中使用,但它们不适用于您的_getch()示例。

现在已经解决了这一点,让我们看一下您的示例:

  • 您可以删除等于224E0
  • 您使用的textarr数组的尺寸为20x20。 这意味着超出textarr[19][19]书写是未定义的行为。 您正在为是大于 20,你使用之前比较数组索引rijen作为替代指标。 您应该让rijen19 这样一来,您就没有无限访问权限。
  • 我将使kolommen旁边rijen 它们之间没有数组是没有意义的,这也妨碍了您为其设置默认值。
  • 您还忽略了许多可打印的字符。 您应该对代码进行结构化,使其末尾具有else条件,然后在其中使用isprint()检查它是否可打印,然后进行打印。
  • 现在是主要部分: if (... || (keuze <= 64 && keuze >= 126)) 看到问题了吗? 我猜你的意思是(keuze >= 64 && keuze <= 126) 现在,您将忽略所有ASCII字母。
  • 也许您想在开始运行texteditor()之前清除屏幕。 system("cls")是执行此操作的标准Windows方法。

另一件事,嵌套三元表达式很丑。 在第二个三元表达式周围,用于该条件的不需要的括号会更好。 此外,Windows控制台默认为80x25,您可能要使用它而不是20x20。

最后, conio.h是一个非标准的头文件,您最好使用<windows.h>提供的功能。 或完全摆脱Windows中的次优终端处理,并使用ncurses之类的库与适当的终端一起使用。

这些代码基于ansi.sys (需要一些附加程序才能在现代Windows上运行)。 您尚未确定正在使用哪个加载项。 也许您在Daniweb文章中提到了一些如何检测箭头键的来源?

有关箭头键和getch (实际上与_getch相同-请参阅getch()和_getch()之间的区别 )已得到回答:

用于左/右/上/下的代码基于ansi.sys识别的转义序列的最终字符,例如,(根据ncurses ):

    kcub1=\0K,   
    kcud1=\0P,  
    kcuf1=\0M,   
    kcuu1=\0H,

但是\\0可能是其他字符,例如\\033[\\340 ,取决于配置。 后者可能是Windows扩展前缀代码,如CPlusPlus论坛上的“ 扫描代码 ”中所述。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM