C++ getch()和混合常规键与箭头键

C++ getch()和混合常规键与箭头键,c++,ascii,arrow-keys,getch,C++,Ascii,Arrow Keys,Getch,我无法在控制台上显示文本,也无法正确保存。我得到了箭头键,回车键,退格键和escpe键 另外一个我没有真正得到的/小的/错误是,当我按下esc键,它从空白处退出时,我被引导到这段代码 #endif /* defined (_M_IX86) || defined (_M_X64) */ __fastfail(FAST_FAIL_STACK_COOKIE_CHECK_FAILURE); 在gc_report.c的内部,我找不到关于它的核心信息(或者至少与我的问题相关) #定义键向

我无法在控制台上显示文本,也无法正确保存。我得到了箭头键,回车键,退格键和escpe键

另外一个我没有真正得到的/小的/错误是,当我按下esc键,它从空白处退出时,我被引导到这段代码

#endif  /* defined (_M_IX86) || defined (_M_X64) */
        __fastfail(FAST_FAIL_STACK_COOKIE_CHECK_FAILURE);
在gc_report.c的内部,我找不到关于它的核心信息(或者至少与我的问题相关)

#定义键向上72
#定义向下80键
#定义左键75
#定义右键77
#定义键\u输入13
#定义键\u退格8
#定义密钥_escape27
无效文本编辑器(int x,int y,int kolommen,char textarr[20][20],int rijen=20)
{
int-index=0,indey=0,keuze,lol=20;
做{
gotoxy(指数+x,指数+y);
基兹=0;
基兹=_getch();
如果(基兹==0 | |基兹==0xE0 | |基兹==224)
{
基兹=_getch();
gotoxy(指数+x,指数+y);
开关(基兹)
{
案例编号:indey--;
打破
案例键_左:索引--;
打破
case KEY_DOWN:indey++;
打破
case KEY_RIGHT:index++;
打破
}
indey=(indey-kolommen)?kolommen:indey;
索引=(索引rijen)?rijen:索引;
}

如果(keuze==32 | |)(keuze>=46&&keuze代码基于
ansi.sys
(这需要一些附加组件才能在现代Windows上运行)。您没有确定正在使用哪个附加组件。可能您指的是Daniweb文章中的某个源代码

有关箭头键和
getch
(出于实际目的,请参见)的问题已在之前得到回答:

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


但是
\0
可以是其他字符,例如
\033[
\340
,具体取决于配置。后者可能是CPlusPlus论坛中提到的。顾名思义,ASCII字符集描述的是字符集,而不是键盘上的键。因此,ASCII中没有箭头键的值

相反,您正在使用的
\u getch()
函数将返回
224
E0h
)或
0
,以指示以下内容是键扫描代码。您正在使用的值是正确的,您可以查找它们

您找到的其他值(37-40)称为虚拟键,更为常见。例如,它们在Javascript中为
event.keyCode
返回,但它们也不适用于您的
\u getch()
示例

现在,问题已经解决了,让我们看看您的示例:

  • 您可以删除
    E0
    ,因为它等于
    224
  • 您正在使用的
    textarr
    数组的维度为20x20。这意味着在
    textarr[19][19]之外写入
    是未定义的行为。在使用
    rijen
    作为替代索引之前,您正在比较数组索引是否大于20。您应该使用
    rijen
    be
    19
    。这样您就没有越界访问权限
  • 我会将
    kolommen
    放在
    rijen
    旁边。将数组放在它们之间是没有意义的,因为它会妨碍您为它设置默认值
  • 您还忽略了许多可打印的字符。您应该将代码的结构设置为在末尾有一个else条件,然后使用
    isprint()
    检查它是否可打印,然后打印它

  • 现在是主要部分:
    if(…| | |(keuze=126))
    。你看到问题了吗?我猜你的意思是
    (keuze>=64&&keuze这是哪个系统?DOS?
    
    #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);}
    
        kcub1=\0K,   
        kcud1=\0P,  
        kcuf1=\0M,   
        kcuu1=\0H,