5

所以这里是代码:

int create_mask(unsigned b, unsigned e)
{
  unsigned int mask=1;

  if(b<e || b<0 || e<0)
  {
    printf("Wrong values, starting bit can't be smaller than ending.\n");
    printf("Both got to be >= 0.\n");
    exit(EXIT_FAILURE);
  }
  while(b>0)
  {
    printf("%u\n", b);
    mask<<=1;
    if(b>e)
      mask|=1;
    b--;
  }

  return ~mask; /* negates mask for later purpose that is clearing corresponding bits */
}

函数为某些位操作创建掩码,但应采用两个无符号整数 b 和 e,均为非负数。问题是如何防止用户输入负数?当使用 (-1,0) 调用函数时,它会启动循环,并应退出并出现错误。

4

3 回答 3

5

您可以只输入一个字符串,检查它是否包含'-'字符,如果包含则产生错误。否则,您将其转换为无符号整数并继续。(作为字符串读取,然后转换为无论如何strtoul()都优于使用scanf(),尤其是当您不了解 . 的所有怪癖时scanf()。)

char buf[LINE_MAX];
fgets(buf, sizeof buf, stdin);

if (strchr(buf, '-') != NULL) {
    fprintf(stderr, "input must be non-negative!\n");
    exit(-1);
}

unsigned int n = strtoul(buf, NULL, 0);
于 2013-09-02T14:13:07.843 回答
2

编辑:

您可以long int输入输入,然后检查输入是否介于两者之间。 如果是0 to ending range of unsigned int这样,那么分配给您的变量,否则会向用户引发异常,您应该只提供无符号数字作为输入。

long int input;
unsigned int valid_input;

scanf("%ld",&input);
if((0<= input) && (input <= 4294967295))
valid_input= (unsigned int)input  ;
else
printf("Unvalid input\n");

正如H2CO3所说。将输入读入字符串并检查第一个文字,如果它不是负数,则转换为无符号整数将比下面的方法更可取。因为一半的无符号整数部分没有被覆盖。

您可以将输入输入int,然后如果它是非负数,则继续。如果它是负数,则向用户提出异常,您不应该给出负数输入。

于 2013-09-02T13:58:17.283 回答
0

看看这个:停止函数隐式转换

我能够根据您的问题对其进行调整,并且它会阻止程序链接。上述线程中的信息似乎部分不正确,因为示例编译良好。它无法链接,因为没有定义模板特化。实际上,我对以下适用于 int vs unsigned int 感到有些惊讶。

template <class T>
void foo(const T& t);

template <>
void foo<unsigned int>(const unsigned int& t)
{

}

int main(){
  foo((unsigned int) 9); // will compile and link
  unsigned int value(5);
  foo(value);// will compile and link
  foo(9.0); // will not link
  foo(-9); // will not link
  return 0;
}

我认为你可能想多了。真的有问题吗?以 int 开头的 id 类型会更好吗?是否有一个最小/最大 id 可以避免可能被误认为是双恭维的大数字?这似乎是语言的一个不幸问题,它没有提供任何简单的方法来停止隐式强制转换。

我使用 Visual Studio 2010 测试了该示例。此外,我没有时间编写测试类,因此如果您对它感兴趣,那么您必须将该示例调整为 foo 类,以查看它是否适用于一个类,或者如果有另一种方法可以使用模板来做到这一点。根据其他答案和我的经验,我认为您不会找到一种简单的方法来做您想做的事。

于 2014-01-20T20:59:37.783 回答