扫描用户的位输入

时间:2014-01-30 10:34:21

标签: c

我想知道扫描输入的最佳方法是什么..让用户说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中写什么?等等 非常感谢。

2 个答案:

答案 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)很大,那么对用户来说就不方便了。