十六进制为无符号整数

时间:2018-02-16 09:03:47

标签: c string segmentation-fault hex

我尝试转换字符串,将其拆分然后取十六进制并将其转换为无符号整数 (例如,示例中的字符串为"read16 8033B21A")。 我已经被困在这个很长一段时间了。

任何一点都会非常感激吗?

else if (strncmp(input, "read16 ", 7) == 0){
    char * tempaddr;
    sscanf(input, "read16 %c", &tempaddr); 
    unsigned int addr;
    sscanf(tempaddr, "%x", &addr);
    unsigned int memvalue=debugger_read_16(addr);
}

之后喜欢分段错误,我无法弄清楚我做错了什么。

2 个答案:

答案 0 :(得分:1)

你可以使用%x格式说明符,它与无符号的十六进制数字直接匹配,如

char str[]="read16 8033B21A";
unsigned n;
sscanf(str, "%*s %8x", &n);
printf("\n%u", n);

这给出了:

2150871578

%*s读取字符串直到空白区域,然后将其丢弃。 *用于分配抑制。有关scanf()函数系列的信息,请参阅here

然后读取空格,之后将8个字符作为无符号十六进制读入变量n

您可以使用%u格式说明符打印unsigned int变量。

在您的计划中,

char * tempaddr;
sscanf(input, "read16 %c", &tempaddr)

看起来不对。

应该是

char tempaddr;
sscanf(input, "read16 %c", &tempaddr)

因为sscanf()需要写入值的地址。如果tempaddr是一个未初始化的指针,非法内存访问可能会发生,因为tempaddr可能有一些垃圾值,恰好是程序不应该访问的内存位置的地址。 / p>

答案 1 :(得分:0)

换句话说,评论说的是改变这个:

char * tempaddr;
sscanf(input, "read16 %c", &tempaddr); 

这样的事情

char tempaddr[32];
sscanf(input, "read16 %s", tempaddr); 

这里的尺寸32是任意的,确保它足够。
希望有所帮助。