使用strtoull()转换为C中的long long int

时间:2015-02-26 06:25:17

标签: c hex long-integer

我想要做的是接收一个填充了数千行十六进制值的输入txt文件,并将它们转换为long long int。

示例:

0x7f1a91026b00
0x7f1a91026b03
0x7f1a91027130
0x7f1a91027131
0x7f1a91027134
0x7f1a91027136
0x7f1a91027138
0x7f1a9102713a
0x7f1a9102713c

但是我把它们作为字符串读取,我如何将它们转换为long long int类型?我被告知我可以使用strtoull()函数,但我不明白它是如何工作的。这就是我目前所拥有的:

int main (int argc, char **argv){

    if(argc!=2){
        printf("error\n");
        return 0;
        // if there is no input then print an error
    }

    FILE *file = fopen(argv[1], "r");

    char linestring[BUFSIZ];
    char **ret;
    while (fgets(linestring, sizeof(linestring), file)) // reads the entire file until it hits Null
    {

    strtoul(linestring, ret, 16);
    printf("%s\n", ret);
    printf("%s\n", linestring);

    }


    fclose(file);
}

这显然不起作用,但有人可以向我解释一下我应该做些什么吗?

3 个答案:

答案 0 :(得分:0)

尝试使用sscanf,例如:

  long long int data;
  sscanf(linestring, "%llx", &data);

修改

或者按照用户3386109的建议,关于C ++ 11

答案 1 :(得分:0)

strtoull函数返回转换后的值,所以你想要这样的东西

char *endptr;
unsigned long long value = strtoull(linestring, &endptr, 16);
printf( "%llx\n", value );

答案 2 :(得分:0)

strtoul的第二个参数应为NULL或指向有效的内存地址。在您的代码中,ret具有未定义的值。

char *ret;
unsigned long value;

value = strtoul(linestring, &ret, 16);

可能就是您所需要的。 &retret的地址,char*