我有一个包含十六进制字符(没有0x或\ x)的char字符串:
> char *A = "0a0b0c";
我想从中获得
> const char *B = "\x0a\x0b\x0c";
是否有一种有效的方法?谢谢!
编辑:为清楚起见,我希望结果字符串包含3个字符\ x0a,\ x0b,\ x0c,而不是12个字符串,表示“ \ x0a \ x0b \ x0c”,其中“ \”和x”被读取为单个字符。
这是我尝试过的:
const char *B[12]; for(j=0; j<4; ++j) { B[4*j+0] = '\\'; B[4*j+1] = 'x'; B[4*j+2] = A[2*j]; B[4*j+3] = A[2*j+1]; }; B[12]='\0';
这给了我12个字符串“ \ x0a \ x0b \ x0c”,但我希望B像这样被分配:
const char *B = "\x0a\x0b\x0c";
我有一个包含十六进制字符(没有0x或\ x)的char字符串:> char * A =“ 0a0b0c”;我想从中获得> const char * B =“ \ x0a \ x0b \ x0c”;有没有一种有效的方法...
您可以编写一个将所需的sprintf转换为字符串,然后将其与目标字符串合并的函数。
如果您只是想在[[string-literal]中的每个"\x"
之前添加'0'
,并在新字符串A
中添加结果,那么就需要一个简单直接的循环,和B
中的存储足以处理B
中每个"\x"
的'0'
加法。
$ ./bin/straddescx
\x0a\x0b\x0c
// remember to #include <ctype.h>
char *input = "0a0b0c";
char *p = input;
while (*p) {
v = (isdigit((unsigned char)*p) ? *p-'0' : *p-'a'+10) * 16;
p++;
v += isdigit((unsigned char)*p) ? *p-'0' : *p-'a'+10;
p++;
printf("0x%d", v); // use v
}
,但可以更改字符串,但不允许插入字符。因为那样会使字符串更长,因此不适合可用内存。如果您无法立即使用所需的大小创建目标字符串,那么这将是一个问题。