使用fscanf(文件,%x,x)并将十六进制转换为C中的整数

时间:2013-12-10 02:57:45

标签: c hex scanf

如果某个内容是十六进制数,我想使用fscanf来检查。 例如,我想打电话

if(fscanf(file,"%x", &u))

就像人们用字符串和整数来调用它一样。问题是这样的: 首先,你应该是什么类型的? 其次,一旦我得到这个十六进制,即如果if语句通过,我怎么能将u转换为整数?

注意: 我想要

if(fscanf(file, "%x", &u) == 1)
如果读入的数字是0x_ _ ,则

为真,否则为false。 我试过了

if(fscanf(file, "0x%x", &u) == 1)

但是对于十六进制数字

,它返回false

2 个答案:

答案 0 :(得分:2)

来自scanf手册页:

  

x,X匹配可选的带符号十六进制整数;下一个指针必须是指向 unsigned int 的指针。

您无需执行任何操作即可将其转换为整数,这就是scanf为您所做的事情。

如果您特别想要匹配0x___,请将其添加到格式字符串中:

if (fscanf(file, "0x%x", &u) == 1)

我测试的完整代码:

#include <stdio.h>
#include <unistd.h>

int main (int argc, char *argv[])
{
    unsigned int u;
    if (scanf("0x%x", &u) == 1) {
        printf("Read hex: %u\n", u);
    } else if (scanf("%u", &u) == 1) {
        printf("Read decimal: %u\n", u);
    }
}

答案 1 :(得分:0)

关于@Barmar的讨论值得赞扬。

通过sscanf()strtol()读取数据并以多种方式处理。

unsigned u;
char buf[27];
if (scanf("%26[xX0-9A-Fa-f]", buf) != 1)
  ;//handle_bad_input();
else {
  char ch;
  if (sscanf(buf, "%u%c", &u, &ch) == 1)
    printf("decimal found %u", u);
  else if (sscanf(buf, "0x%X", &u) == 1)
    printf("hexadecimal found 0x%X", u);
  else
    ;//handle_bad_input();
  }