我想要做的是接收一个填充了数千行十六进制值的输入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);
}
这显然不起作用,但有人可以向我解释一下我应该做些什么吗?
答案 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);
可能就是您所需要的。 &ret
是ret
的地址,char*
。