C - 读取十六进制数并检查是否小于零scanf()

问题描述 投票:-1回答:1

我正在用C语言编写一个用scanf()读取十六进制数的程序,我想检查该值是否有效。但如果我写-5它表明输入有效。有没有一些简单的方法可以检查输入是否小于零,还是我必须将其读作签名然后更改它?

unsigned int number;
scanf("%x",&number);
if (....) {
    printf("Invalid input!\n");
}
c hex scanf
1个回答
0
投票

有没有一些简单的方法来检查输入是否小于零

"%x"接受像"-123"这样的输入并形成unsignedUINT_MAX + 1 - 123正值。仅仅这一点还不够。

或者,自己寻找'-'

下面使用"%n"来检测扫描是否成功通过1个或更多'-'(用"%*[-]"扫描)。如果没有领先的'-',除了领先的空间消耗,n仍为0。

  int n = 0;
  scanf(" %*[-]%n", &n);
  if (n) {
    printf("Invalid negative input!\n");
  } else if (scanf("%x",&number) != 1) {
    printf("Invalid non-hex input!\n");
  } else {
    printf("Success %x\n", number);
  }

如果发生无效输入,则不清楚OP想要做什么。


更好的方法是使用fgets()读取一行用户输入,然后解析它。

 char buf[80];
 if (fgets(buf, sizeof buf, stdin) {
   unsigned int number;
   if (strchr(buf, '-') == NULL && sscanf(buf, "%x", &number) == 1) {
     printf("Success %x\n", number);
   } else {
     printf("Fail\n");
   }
}

更好的代码将使用strtoul()而不是sscanf()

© www.soinside.com 2019 - 2024. All rights reserved.