我正在用C语言编写一个用scanf()
读取十六进制数的程序,我想检查该值是否有效。但如果我写-5它表明输入有效。有没有一些简单的方法可以检查输入是否小于零,还是我必须将其读作签名然后更改它?
unsigned int number;
scanf("%x",&number);
if (....) {
printf("Invalid input!\n");
}
有没有一些简单的方法来检查输入是否小于零
"%x"
接受像"-123"
这样的输入并形成unsigned
的UINT_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()
。