【问题标题】:Using Arrow Keys in C在 C 中使用箭头键
【发布时间】:2014-01-24 06:16:55
【问题描述】:

我终于掌握了 C 语言中的箭头键。我发现了如何让 C 检测它们并实际编写了一个程序。

问题是……程序有问题。我不知道我做错了什么。

代码:

#include <stdio.h>
main()
{
    char menitem[3][32], key, key2;
    int i = 0;
    strcpy(menitem[0], "Option 1 [X]");
    strcpy(menitem[1], "Option 2 [ ]");
    strcpy(menitem[2], "Option 3 [ ]");
    start:
    system("cls");
    printf("%s\n%s\n%s", menitem[0], menitem[1], menitem[2]);
    key = getch();
    key2 = 0;
    if(key = 0xE0)
    key2 = getch();
    ret:
    if(i == 0)
    {
         switch(key2)
         {
        case 80:
            strcat(menitem[0], "\b\b ]");
            i++;
            strcat(menitem[i], "\b\bX]");
            goto start;
        default: goto ret;
     }
}
else if(i == 2)
{
     switch(key2)
    {
    case 72:
        strcat(menitem[2], "\b\b ]");
        i--;
        strcat(menitem[i], "\b\bX]");
        goto start;
        default: goto ret;
    }
}
else
{
    switch(key2)
    {
        case 80:
        strcat(menitem[i], "\b\b ]");
        i++;
        strcat(menitem[i], "\b\bX]");
        goto start;
        case 72:
        strcat(menitem[i], "\b\b ]");
        i--;
        strcat(menitem[i], "\b\bX]");
        goto start;
        default: goto ret;
    }
}
}

问题来了:

当我从选项 2 上升时,选项 3 变成“X]”。知道为什么吗?

尝试编译它并继续使用箭头键。走着瞧吧。将不胜感激任何帮助!

【问题讨论】:

  • 你的问题到底是什么???
  • 这是什么平台?箭头键本身不是 C 的一部分,而是宿主环境。
  • “运行我的代码以查看问题”不是您应该在 SO 问题中提出的问题。此外,修复缩进(TAB char 在 SO 有问题)。打开编译器的警告并修复它们
  • 关于使用 goto 来实现循环......当你为自己编写代码时,任何事情都会发生,但请注意,几乎所有程序员都会回避任何代码那个。
  • if(key = 0xE0) => if(key == 0xE0)

标签: c text arrow-keys


【解决方案1】:

执行 /b 并删除输入,然后一遍又一遍地添加输入,这不是一个好主意。一方面,如果用户按了很多箭头键,你会得到大量的退格/删除字符,你的字符串会变得非常大。您遇到问题是因为您在某些情况下删除了太多字符。相反,只需对 [] 中的字符进行内存修改。我将使用可行的解决方案编辑这篇文章。

编辑这是一个可行的解决方案:

#include <stdio.h>
int main()
{
    char menitem[3][32], key, key2;
    int i = 0;
    int currentlySelectedItem = 1;
    strcpy(menitem[0], "Option 1 [X]");
    strcpy(menitem[1], "Option 2 [ ]");
    strcpy(menitem[2], "Option 3 [ ]");
    while(1)
    {
        system("cls");
        printf("%s\n%s\n%s", menitem[0], menitem[1], menitem[2]);
        key = getch();
        key2 = 0;
        if(key == -32)
        {
            key2 = getch();
        }
        else
        {
            continue;
        }
        if(key2 == 80)
        {
            currentlySelectedItem++;
        }
        else if(key2 == 72)
        {
            currentlySelectedItem--;
        }

        //make sure the selected item stays in range
        if(currentlySelectedItem < 1)
            currentlySelectedItem = 1;
        if(currentlySelectedItem > 3)
            currentlySelectedItem = 3;

        menitem[0][10] = ' ';
        menitem[1][10] = ' ';
        menitem[2][10] = ' ';
        menitem[currentlySelectedItem-1][10] = 'X';

    }

}

【讨论】:

  • 您正在使用的任何东西都不需要 Windows.h。另外,它是int main,而不是void
  • 不正确。此行需要 Windows.h:system("cls");。不过,您对 int main 是正确的。我已经解决了。
  • 不。在 DevC++ 中,system("");即使没有 windows.h 也可以工作
  • @George:不只是 DevC++,system() 本身是标准 C,windows.h 不需要。 cls 是特定于 Windows 的(你不应该使用它 - 好吧,通常你会希望避免使用 system period),但这是由 cmd.exe、@987654330 处理的@ 没有以任何方式参与。
  • 有趣。感谢您的澄清 :) 这可能是因为我使用的是 VS C++ 编译器,但如果我不包含至少 stdlib.h,它将无法编译;我收到以下错误:"error C3861: 'system': identifier not found"
最近更新 更多