ASCII字符数组转十六进制字符数组遇sprintf参数报错如何解决
问题原因
sprintf函数第一个参数要求是指向目标缓冲区的char*类型指针,你传入的buff[0]是char类型的单个字符值,属于整型数据,不是内存地址,因此触发了「整数转指针未做强制转换」的警告。
解决方法
修复当前语法错误
只需要把sprintf的第一个参数改成缓冲区首地址即可,buff或&buff[0]都可以,修改后代码如下:
char string[20]="abcd"; char buff[4000]; sprintf(buff,"%02x",string[0]); printf("string[0]: %c, 十六进制字符串: 0x%s",string[0], buff);
完整实现ASCII数组转十六进制初始化格式功能
如果要实现你预期的输出格式(生成char buf[4096] = {0x61, 0x62, ...};样式的字符串),可以参考下面的完整实现:
#include <stdio.h> #include <string.h> int main() { char string[] = "abcd1234567"; char buf[4096] = {0}; int offset = 0; int len = strlen(string); // 先写入前缀 offset += sprintf(buf + offset, "char buf[4096] = {"); for (int i = 0; i < len; i++) { if (i != 0) { offset += sprintf(buf + offset, ", "); } offset += sprintf(buf + offset, "0x%02x", (unsigned char)string[i]); } // 写入后缀 offset += sprintf(buf + offset, "};"); printf("%s\n", buf); return 0; }
运行后输出结果和你预期的格式完全一致。
若需要存十六进制数值而非字符串
如果你的需求不是生成C代码格式的字符串,而是要把ASCII字符对应的十六进制数值直接存到无符号字符数组里,不需要用sprintf,直接赋值即可:
char string[] = "abcd1234567"; unsigned char hex_buf[4096] = {0}; int len = strlen(string); for (int i = 0; i < len; i++) { hex_buf[i] = (unsigned char)string[i]; }
内容的提问来源于stack exchange,提问作者Othmane
相关产品推荐
相关产品推荐

