我对 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/