我正在用C编写程序,该程序使用scanf()读取十六进制数,并且我想检查该值是否有效。但是,如果我写-5,则表明输入有效。是否有一些简单的方法可以检查输入是否小于零,还是必须先读取带符号的符号然后进行更改?

unsigned int number;
scanf("%x",&number);
if (....) {
    printf("Invalid input!\n");
}

最佳答案

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


"%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()

关于c - C-读取十六进制数字并检查是否小于零scanf(),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/55127405/

10-16 11:32