时语-shine 2023-01-12 10:14 采纳率: 61.5%
浏览 17
已结题

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

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

代码如下:

#include <stdio.h>
#include <conio.h>
#include <ctype.h>
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码。为什么会出现这种问题,该怎么解决?

  • 写回答

1条回答 默认 最新

  • |__WhoAmI__| 2023-01-12 10:35
    关注

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

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

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

问题事件

  • 系统已结题 1月20日
  • 已采纳回答 1月12日
  • 创建了问题 1月12日

悬赏问题

  • ¥15 Vue3 大型图片数据拖动排序
  • ¥15 划分vlan后不通了
  • ¥15 GDI处理通道视频时总是带有白色锯齿
  • ¥20 用雷电模拟器安装百达屋apk一直闪退
  • ¥15 算能科技20240506咨询(拒绝大模型回答)
  • ¥15 自适应 AR 模型 参数估计Matlab程序
  • ¥100 角动量包络面如何用MATLAB绘制
  • ¥15 merge函数占用内存过大
  • ¥15 使用EMD去噪处理RML2016数据集时候的原理
  • ¥15 神经网络预测均方误差很小 但是图像上看着差别太大