在C中我是相当熟悉的,我知道从stdin中设置变量的唯一方法是使用fscanf()/vscanf()函数家族。
在嵌入式市场上,DOS操作系统正在复苏。我正在使用的设备是与DOS程序兼容的,并使用了80286指令集的NEC V30Mx。
问题在于,内置键盘没有使用enter键,而是使用EXE键输入0x1C00键代码(http://diddy.boot-land.net/grub4dos/files/README_GRUB4DOS.txt)。
所以当我写这样的程序时:
#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密钥代码,并且EXE键使用不同的密钥代码。
当然,C不了解键盘,但是C标准库二进制文件会查找输入0x1C0D密钥代码的\n。
那么,除了作为C标准库一部分的fscanf()/vscanf()函数家族之外,还有其他选择吗?
最新情况:
我认为dos下的大多数C标准库都是使用软件实现来实现的。我看到DOS呼叫用于读取文件,当然,使用数字0从stdin读取。
所以我组装了这个例子,把它装在计算器上,发现自己惊讶于制造商更喜欢在其内置软件中处理这个问题,而不是修复操作系统.--((我得到的结果和以前的一样)
更新
我没有想过,但感谢评论,我忘记了键盘语言做键代码重新映射。因此,为qwerty键盘创建自定义映射将是解决问题的另一种方法。
发布于 2015-03-23 19:19:12
问题是scanf没有读取表示EXE键的stdin中存在的字节。
当您按下getchar()键时,您是否可以查看EXE读取的实际字符,并编写一个函数hasexe(),如果存在的话跳过这些字符。在scanf()之前或之后调用此函数。
还检查scanf()返回值并检查是否为EOF。
发布于 2015-03-25 15:19:16
用标准C库解决这一问题的唯一方法是使用getchar() (或stdin上的fgetc() )一次得到一个字符,自己检测EXE键,NUL终止字符串并将其传递给sscanf()。
https://stackoverflow.com/questions/29213463
复制相似问题