扫描用户的位输入

  • 本文关键字:用户 扫描 c
  • 更新时间 :
  • 英文 :


我想知道什么是扫描输入的最佳方法。我将使用简短的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)很大,那么对用户来说会带来不便。

最新更新