我想知道扫描输入的最佳方法是什么..让用户说16位。(exp:[0 1 0 0 1 1 0 ...]) 我将使用short int。
让我们说每个位都代表一些属性。 我希望用户能够通过两种方式给我输入(位的一些排列):
第一种方式:所有16位都用零初始化,用户将给我他想要打开的位的位置:
short int a = 0; (看起来像[000000 .... 0])
让我们说用户选择3,5
所以,我知道我可以制作一个初始化为0的掩码,将所请求的位置(将为1)这样:
short int mask = 0x1; 掩模<< = 3;
A | =掩模;
之后用掩码代表第五位。 但对于doint有更好的方法吗?
所谓的问题是,我想从用户那里扫描代表所请求的排列的字符串。 (exp:01101010100 ..) 我该怎么做? syntex对我来说很重要..我应该在scanf中写什么?等等 非常感谢。
答案 0 :(得分:1)
由于2个输入的语法不同,因此允许两者。
// pseudo code
fgets(buffer,...);
if (IsSyntax1(buffer)) {
a = ProcesssPerSyntax1(buffer, a);
else if (IsSyntax2(buffer)) {
a = ProcesssPerSyntax2(buffer, a);
else Error();
语法分析器示例
char *endptr;
// looking for 16-digit binary number
unsigned long tmp = strtoul(buffer, &endptr, 2);
if (endptr == &buffer[16] && *endptr == '\n') {
a = (short) tmp;
}
else {
// Search for comma separated 0-15 offsets
char *p = buffer;
unsigned mask = 0;
do {
unsigned long index = strtoul(p, &endptr, 10);
if (index >= 16) return fail;
if ((*endptr != ',') && (*endptr != '\n')) return fail;
if (endptr == p) return fail;
mask |= 1U << (unsigned) index;
p = endptr + 1;
} while (*endptr == ',');
a = mask;
}
[编辑]
应该使用strtoul()与strtol()来处理16位int/unsigned
,如@BLUEPIXY评论所示。
答案 1 :(得分:0)
如果您不担心内存使用情况(无论如何,它并不多)您可以将输入作为字符串,然后使用strtol
(来自stdlib.h
)或类似函数进行转换到整数。
我建议strtol
,因为您可以在此指定转化基础。
在你的第一种方法中,我看到一个限制,如果设置位数(1
s)很大,那么对用户来说就不方便了。