我尝试转换字符串,将其拆分然后取十六进制并将其转换为无符号整数
(例如,示例中的字符串为"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);
}
之后喜欢分段错误,我无法弄清楚我做错了什么。
答案 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是任意的,确保它足够。
希望有所帮助。