关于getche()检测用户按键的问题

问题背景:
我想设计程序,可以让用户任意按键,按到可打印字符时存进数组,否则舍弃,检测到回车键结束输入

代码如下:

#include 
#include 
#include 
int main()
{
    char temp[100] = { 0 };
    char c = 0;
    int i = 0;
    int I = 0;
    int a;
    int A[100] = {};
    c = getche();
    while (c != '\r')
    {
        a = isprint(c);
        A[I++] = a;
        if (a)
            temp[i++] = c;
        else
        {
            temp[i++] = '*';
        }
        c = getche();
    }
    printf("\n");
    for (int i = 0; i < 10; i++)
    {
        printf("%d ", A[i]);
    }
    printf("\n");
    puts(temp);
    return 0;
}

测试按键: F1,F2,3键,4,5
运行结果:

img

问题:
发现如果按到一些不会打印字符的键,如F1,F2等,例如getche()对F1能读两次,第一次的ASCLL码为0,第二次的不为0,而且是可打印字符的ASCLL码。为什么会出现这种问题,该怎么解决?

'getche()' 函数是一个在控制台程序中常用的函数,它可以读取一个字符并立即显示到屏幕上。 这个函数在读取 F1 按键时会出现错误,这是因为 F1 按键不是一个可打印字符,它会产生一个特殊的控制码。这个控制码可能会在读取到之后被转换为可打印字符,导致'getche()'读取了两次。

解决这个问题的一种方法是使用 'getch()' 函数来代替 'getche()',因为'getch()' 函数会直接读取按键的 ASCII 码,而不是将按键转换为可打印字符。 另外,结合 if-else 或 switch 来判断回车键和其他非可打印字符(非法字符)的ASCLL码。如果是的话就忽略,如果不是的话就将其存储起来。
仅供参考,望采纳,谢谢。