c - 使用替代验证 key 的 fscanf()/vscanf() 函数系列的替代方案或如何创建自定义语言布局?

标签 c keyboard embedded dos turbo-c

我对 C 相当了解。我知道从 stdin 设置变量的唯一方法是使用 fscanf()/vscanf() 函数系列。

DOS 操作系统正在嵌入式市场中复苏。我使用的设备在编程上与 DOS 兼容,并使用具有 80286 指令集的 NEC V30Mx。
问题是内置键盘没有 Enter 键,而是使用 EXE 键输入 0x1C00 key 代码( Alt enter )

所以当我编写这样的程序时:

#include <stdio.h>
#include <dir.h>
#include <dos.h>
int main(void) {
    int res, number = 0;
    printf("int value?");
    res = scanf("%d", &number);
    printf("The value is %d", number);
    return;
}

scanf()被调用,屏幕上显示“int value?”。我可以写数字和大写字母。但我无法验证输出,因为没有任何特征 0x1C0D key code ,并且 EXE 键使用不同的键码。
当然,C 不了解键盘,但 C 标准库二进制文件会查找 0x1C0D key code用于输入\n

那么,作为 C 标准库一部分的 fscanf()/vscanf() 函数系列是否有替代方案?

更新:

我认为 dos 下的大多数 C 标准库都使用软件实现来执行此操作。 我看到a DOS call用于读取文件,当然,使用数字 0 会导致从标准输入读取。
所以我组装了this example ,将其加载到计算器上,发现自己很惊讶制造商更愿意在其内置软件中处理问题,而不是修复操作系统...:-( (我得到了与之前相同的结果)

更新

我没有想到这一点,但由于评论,我忘记了键盘语言进行键代码重新映射。 因此,为 qwerty 键盘创建自定义映射将是解决该问题的另一种方法。

最佳答案

问题是 scanf 无法读取 stdin 中代表 EXE 键的字节。

您能否研究一下当您按下 EXE 键时 getchar() 实际读取了哪些字符,并编写一个函数 hasexe() 会跳过这些(如果存在)。在 scanf() 之前或之后调用此函数。

同时检查 scanf() 返回值并检查 EOF

关于c - 使用替代验证 key 的 fscanf()/vscanf() 函数系列的替代方案或如何创建自定义语言布局?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29213463/

相关文章:

Android Lollipop 软键盘不接受 GL 表面的按键

android - 为什么 Android webview 仅在键入 "Next"而不是键入 ="number"时才在键盘中显示 ="text"?

visual-studio - Visual Studio 中的嵌入式代码开发(尤其是对于带有 C18 的 PIC)

c - MC9S08QD4 - 分配给 doubles/longs "corrupts"无关变量

c - 查看后台进程的输出

java - InputMap for CTRL only 中的 KeyStroke 必须有 CTRL_DOWN_MASK 和 CTRL_MASK(仅限 win10)

embedded - 映射文件和链接器文件之间的区别

c - 未找到 read() 结束行导致代码输出奇怪的符号

c - 如何从 ptr 获取结构页面信息并使用 kmalloc 或 vmalloc 固定内存?

c - 如何使用 FFMpeg 将图像转换为视频以用于嵌入式应用程序?