我想知道什么是扫描输入的最佳方法。我将使用简短的int。
可以说,每个位都代表某些财产。我希望用户能够通过两种方式给我输入(某些位置的置换):
第一种方法:用零开始的所有16位,用户将为我提供他想打开的位点:
short int a = 0;(看起来像[000000 .... 0])
说用户选择3,5
所以,我知道我可以用零来初始化的掩码,例如1):
简短的int mask = 0x1;mask<< = 3;
a | = mask;
以及用代表第五位的掩码的同一件事。但是有更好的方法吗?
seconed问题是,说我想从用户扫描代表所请求的置换的字符串。(EXP:011010100 ..)我应该怎么做?Syntex对我很重要。.我应该在scanf中写什么?ETC。非常感谢。
,由于两个输入的语法是不同的,因此允许
。// 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()来处理@bluepixy评论所暗示的16位int/unsigned
。
如果您不必担心内存使用量(无论如何,它不多),您可以将输入作为字符串,然后使用strtol
(来自stdlib.h
)或类似功能将其转换为到整数。
我建议strtol
,因为您可以在此处指定转换的基础。
在您的第一种方法中,我看到一个限制,如果设置位数(1
s)很大,那么对用户来说会带来不便。