有没有办法检测是否按下了某个键?

2023-11-29

我正在 Windows 计算机上的 cygwin 中编译并执行我的程序。我对 C 非常缺乏经验,但我想要一种方法来检测是否按下了某个键而不提示用户(例如我)。我的具有所需功能的伪代码如下所示。

char ch;
while(1){
    if(KeyBeenPressed()){
    //a key has been pressed before getting here
        ch=getKeyPressed();
        if(ch=='0'){
            printf("you have pressed 0");
        }
        else{
            printf("you did't press key 0");
        }
    }

//do other stuff
} 

我自己在网上搜索后尝试解决这个问题如下所示。

#include <stdio.h>
#include <conio.h>
char ch;
void main(){
    while(1){
        if(kbhit()){ //kbhit is 1 if a key has been pressed
            ch=getch();
            printf("pressed key was: %c", ch);
        }
    }
}

这段代码的一个问题是找不到 conio.h 文件(而且我还没有找到任何其他方法来解决这个问题)。显然 gcc 编译器无法处理 conio.h(我已附上它的链接)。http://www.programmingsimplified.com/c/conio.h

所以我想知道你们中是否有人知道一种方法来检测 C 中是否按下了某个键,我还想最好以字符形式检索按下的键(我计划在此应用程序中使用 0-9)。重要的是程序不能等到按下某个键。

我感谢任何可以解决此问题的建议! 此致 亨里克


我使用以下函数kbhit()。它在 Ubuntu 中的 g++ 编译器上运行良好。

#include <termios.h>
#include <unistd.h>
#include <fcntl.h>
int kbhit(void)
{
  struct termios oldt, newt;
  int ch;
  int oldf;

  tcgetattr(STDIN_FILENO, &oldt);
  newt = oldt;
  newt.c_lflag &= ~(ICANON | ECHO);
  tcsetattr(STDIN_FILENO, TCSANOW, &newt);
  oldf = fcntl(STDIN_FILENO, F_GETFL, 0);
  fcntl(STDIN_FILENO, F_SETFL, oldf | O_NONBLOCK);

  ch = getchar();

  tcsetattr(STDIN_FILENO, TCSANOW, &oldt);
  fcntl(STDIN_FILENO, F_SETFL, oldf);

  if(ch != EOF)
  {
    ungetc(ch, stdin);
    return 1;
  }

  return 0;
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

有没有办法检测是否按下了某个键? 的相关文章

  • Directory.Delete 之后 Directory.Exists 有时返回 true ?

    我有非常奇怪的行为 我有 Directory Delete tempFolder true if Directory Exists tempFolder 有时 Directory Exists 返回 true 为什么 可能是资源管理器打开了
  • 如何在c++中读取pcap文件来获取数据包信息?

    我想用 C 编写一个程序来读取 pcap 文件并获取数据包的信息 例如 len sourc ip flags 等 现在我找到了如下代码 我认为它会帮助我获取信息 但是我有一些疑问 首先我想知道应该将哪个库添加到我的程序中 然后什么是 pca
  • 确保 StreamReader 不会挂起等待数据

    下面的代码读取从 tcp 客户端流读取的所有内容 并且在下一次迭代中它将仅位于 Read 上 我假设正在等待数据 我如何确保它不会在没有任何内容可供读取时返回 我是否必须设置低超时 并在失败时响应异常 或者有更好的办法吗 TcpClient
  • 提交后禁用按钮

    当用户提交付款表单并且发布表单的代码导致 Firefox 中出现重复发布时 我试图禁用按钮 去掉代码就不会出现这个问题 在firefox以外的任何浏览器中也不会出现这个问题 知道如何防止双重帖子吗 System Text StringBui
  • 从 Powershell 脚本安装 Python

    当以管理员身份从 PowerShell 命令行运行以下命令时 可以在 Windows 11 上成功安装 Python c temp python 3 11 4 amd64 exe quiet InstallAllUsers 0 Instal
  • 为什么 Google 测试会出现段错误?

    我是 Google Test 的新手 正在尝试提供的示例 我的问题是 当我引入失败并设置GTEST BREAK ON FAILURE 1 或使用命令行选项 GTest 将出现段错误 我正在考虑这个例子 https code google c
  • 如何使用 LINQ2SQL 连接两个不同上下文的表?

    我的应用程序中有 2 个数据上下文 不同的数据库 并且需要能够通过上下文 B 中的表的右连接来查询上下文 A 中的表 我该如何在 LINQ2SQL 中执行此操作 Why 我们正在使用 SaaS 产品来跟踪我们的时间 项目等 并希望向该产品发
  • 在一个平台上,对于所有数据类型,所有数据指针的大小是否相同? [复制]

    这个问题在这里已经有答案了 Are char int long 甚至long long 大小相同 在给定平台上 不能保证它们的大小相同 尽管在我有使用经验的平台上它们通常是相同的 C 2011 在线草稿 http www open std
  • 使用自定义堆的类似 malloc 的函数

    如果我希望使用自定义预分配堆构造类似 malloc 的功能 那么 C 中最好的方法是什么 我的具体问题是 我有一个可映射 类似内存 的设备 已将其放入我的地址空间中 但我需要获得一种更灵活的方式来使用该内存来存储将随着时间的推移分配和释放的
  • 如何禁用 fread() 中的缓冲?

    我正在使用 fread 和 fwrite 读取和写入套接字 我相信这些函数用于缓冲输入和输出 有什么方法可以在仍然使用这些功能的同时禁用缓冲吗 Edit 我正在构建一个远程桌面应用程序 远程客户端似乎 落后于服务器 我不知道可能是什么原因
  • CMake 无法确定目标的链接器语言

    首先 我查看了this https stackoverflow com questions 11801186 cmake unable to determine linker language with c发帖并找不到解决我的问题的方法 我
  • 使用 %d 打印 unsigned long long

    为什么我打印以下内容时得到 1 unsigned long long int largestIntegerInC 18446744073709551615LL printf largestIntegerInC d n largestInte
  • 无法访问127.0.0.1

    我不知道这种情况何时开始发生 但结果是 127 0 0 1 无法在任何地方的任何端口上工作 例如 浏览器显示无法连接 以下是我的研究结果 localhost COMPUTER NAME 和实际 IP 地址都工作正常 我的主机文件中没有什么特
  • 不同类型指针之间的减法[重复]

    这个问题在这里已经有答案了 我试图找到两个变量之间的内存距离 具体来说 我需要找到 char 数组和 int 之间的距离 char data 5 int a 0 printf p n p n data 5 a long int distan
  • 如何部署“SQL Server Express + EF”应用程序

    这是我第一次部署使用 SQL Server Express 数据库的应用程序 我首先使用实体 框架模型来联系数据库 我使用 Install Shield 创建了一个安装向导来安装应用程序 这些是我在目标计算机中安装应用程序所执行的步骤 安装
  • System.IO.FileNotFoundException:找不到网络路径。在 Windows 7 上使用 DirectoryEntry 对象时出现异常

    我正在尝试使用 DirectoryEntry 对象连接到远程 Windows 7 计算机 这是我的代码 DirectoryEntry obDirEntry new DirectoryEntry WinNT hostName hostName
  • C++ 条件编译

    我有以下代码片段 ifdef DO LOG define log p record p else define log p endif void record char data 现在如果我打电话log hello world 在我的代码中
  • Oracle Data Provider for .NET 不支持 Oracle 19.0.48.0.0

    我们刚刚升级到 Oracle 19c 19 3 0 所有应用程序都停止工作并出现以下错误消息 Oracle Data Provider for NET 不支持 Oracle 19 0 48 0 0 我将 Oracle ManagedData
  • 当从finally中抛出异常时,Catch块不会被评估

    出现这个问题的原因是之前在 NET 4 0 中运行的代码在 NET 4 5 中因未处理的异常而失败 部分原因是 try finallys 如果您想了解详细信息 请阅读更多内容微软连接 https connect microsoft com
  • 从列表中选择项目以求和

    我有一个包含数值的项目列表 我需要使用这些项目求和 我需要你的帮助来构建这样的算法 下面是一个用 C 编写的示例 描述了我的问题 int sum 21 List

随机推荐

  • C# - WCF - 进程间通信

    用于进程间通信的最佳 WCF 绑定是什么 我已经在本地网络上使用了 WCF 它非常棒 我也想将它用于进程间通信 然而 我不想暴露网络上的通信 Use the 网络命名管道绑定用于同一台机器上的进程间通信 使用NetTcp绑定如果您跨越机器边
  • glutTimerFunc 问题

    我正在使用计时器函数来制作动画 但是当我将其放置在 Renderer 类中时遇到问题 void Renderer animate int value glutTimerFunc TIMERMSECS animate 0 错误 rendere
  • 如何在块循环中使用 PHPExcel 库确定文件结尾?

    使用 PHPExcel 库 我尝试迭代大约 1500 行 每行大约有 25 列 我正在使用这段代码 取自PHPExcel 运行内存为 256 512 和 1024MB Create a new Reader of the type defi
  • Eclipse:以编程方式创建首选项页面

    我正在尝试以编程方式创建首选项页面 我需要使用首选项页面而不在plugin xml 中定义首选项页面扩展点 我非常接近解决方案 我能够加载页面并在应用程序第一次加载时保存值 我的代码的核心是 PreferenceManager pmngr
  • 使用 VBA 创建具有不同计数的数据透视表

    我正在尝试使用 Excel 2013 VBA 创建一个数据透视表 并将 DISTINCT COUNT 作为值字段 我知道 如果您手动创建数据透视表 则必须选中 将此数据添加到数据模型 复选框 以便为值数据透视字段提供不同的计数选项 但我不知
  • Laravel 5.8:Homestead 重启后尚未设置门面根

    所以我正在尝试进入 Laravel 这是我第一次使用 Vagrant 所以这是我的问题 我已经通过Laravel 家园介绍并设置我的开发框 一切似乎都正常工作 我确实看到了 Laravel 默认应用程序 当结束这一天时 我已经停止了本地流浪
  • 仅初始化部分功能一次

    我有一个很小的函数 我想初始化一次 例如 void SomeFunc static bool DoInit true if DoInit CallSomeInitCode DoInit false The rest of the funct
  • 无法更改模型生成器选项

    我试图让 symfony 使用一个名为的自定义类jsDoctrineRecord代替sfDoctrineRecord对于它的模型 这是重写类的代码
  • C# 中调整系统图标大小

    我想用SystemIcons Warning但它对于我的需要来说太大了 我想调整它的大小 我努力了 Icon sizedIcon new Icon SystemIcons Warning new Size 10 10 但它不起作用 图标保持
  • 将图像 src 数据:转换为 Uint8Array

    我想使用 异食癖图书馆 用于调整图像大小 但它要求我提供一个 Uint8Array 并且我只有一个带有 src data image jpeg base64 9j 4AAQ 我不知道如何将其变成 Uint8Array 有什么想法吗 Than
  • 防止将 master 中的文件与 Git 合并

    In 另一个问题建议使用 gitattributes为了保持文件跟踪但不合并到不同的分支中 但我下面的用例似乎不起作用 mkdir git cd git git init echo B gt b txt git add b txt git
  • HTML5:其他标签内有效标签的参考

    不久前我正在使用w3c 验证器对于 HTML5 我正在尝试用一个标签来替换已弃用的
  • Python pandas - 在groupby之后过滤行

    例如 我有下表 index A B 0 0 0 1 0 8 2 0 8 3 1 5 4 1 3 分组后按A 0 index A B 0 0 0 1 0 8 2 0 8 1 index A B 3 1 5 4 1 3 我需要的是从每个组中删除
  • 在 x64 中调用绝对地址

    我无法弄清楚这一点 我可以做出这样的指令 它工作没问题 call ffffdd80d60e4000 但我该如何将其转换为字节呢 我查看了内存中的指令并显示了奇怪的东西 例如 0xe8 0x00 0x40 0x0e 0xd6 我唯一能识别的是
  • 如何正确地为数据结构中的图像设置动画而不出现 ConcurrentModificationException

    对于那些讨厌阅读长问题的人 获取下面的完整代码 运行它 点击SPACE几次 你会得到一个ConcurrentModificationException 简单的问题 你如何解决它 问题是试图删除一个Fireball当它退出屏幕时从列表中删除
  • 在 MySQL 监视器中阅读 MySQL 手册?

    Problem 有效阅读MySQL手册 Error mysql gt create database plastronics gt ERROR 1007 HY000 Can t create database plastronics dat
  • 如何对比两组变量(在 SAS 中)

    数据如下 ID X1 X2 X3 Z1 Z2 Z3 对于每个 ID 考虑两组变量 X1 X2 X3 and Z1 Z2 Z3 that X和Z的数量可以相同或不同 它们也可能有缺失值 每组中的变量值都是唯一的 也就是说 对于每个ID X1不
  • JSONObject.append 到对象中 - 结果是嵌套数组?

    以下代码生成一个嵌套数组作为包含三个项目的键的结果 import org codehaus jettison json JSONObject JSONObject ret new JSONObject for Key key keys re
  • 类和私有变量

    class Test1 def init self self test 1 def getvalue self return self test class Test2 Test1 def init self Test1 init self
  • 有没有办法检测是否按下了某个键?

    我正在 Windows 计算机上的 cygwin 中编译并执行我的程序 我对 C 非常缺乏经验 但我想要一种方法来检测是否按下了某个键而不提示用户 例如我 我的具有所需功能的伪代码如下所示 char ch while 1 if KeyBee