时语-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日

悬赏问题

  • ¥20 机器学习能否像多层线性模型一样处理嵌套数据
  • ¥20 西门子S7-Graph,S7-300,梯形图
  • ¥50 用易语言http 访问不了网页
  • ¥50 safari浏览器fetch提交数据后数据丢失问题
  • ¥15 matlab不知道怎么改,求解答!!
  • ¥15 永磁直线电机的电流环pi调不出来
  • ¥15 用stata实现聚类的代码
  • ¥15 请问paddlehub能支持移动端开发吗?在Android studio上该如何部署?
  • ¥20 docker里部署springboot项目,访问不到扬声器
  • ¥15 netty整合springboot之后自动重连失效