簡體   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作為替代指標。 您應該讓rijen滿19 這樣一來,您就沒有無限訪問權限。
  • 我將使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