我有一个字符串(unsigned char),我想用十六进制字符填充它。
我的代码是
unsigned char str[STR_LEN] = {0};
for(i = 0;i<STR_LEN;i++) {
sprintf(str[i],"%x",rand()%16);
}
当然,在运行时我得到了segfaulted
答案 0 :(得分:7)
char
的数组 - 不是unsigned char
- s str[i]
(类型为unsigned char
)作为sprintf
的第一个参数,但它需要类型char *
(指针)。这应该会好一点:
char str[STR_LEN + 1];
for(i = 0; i < STR_LEN; i++) {
sprintf(str + i, "%x", rand() % 16);
}
答案 1 :(得分:1)
sprintf()
的第一个参数应该是char*
,但str[i]
是char
:这是分段错误的原因 。编译器应该发出警告。 gcc main.c
,未指定高警告级别,发出以下内容:
警告:传递sprintf的参数1使得指针来自整数而没有强制转换
字符的十六进制表示形式可以是1或2个字符(例如9
或AB
)。对于格式设置,请将精度设置为2
,将填充字符设置为0
。还需要将终止空值的一个字符添加到str
,并将for
循环的步骤设置为2
而不是1
(以防止覆盖以前的值):< / p>
unsigned char str[STR_LEN + 1] = {0};
int i;
for (i = 0; i < STR_LEN; i += 2)
{
sprintf(&str[i], "%02X", rand() % 16);
}
答案 2 :(得分:1)
您可以尝试这样的事情:
#include <stdio.h>
#include <stdlib.h>
#define STR_LEN 20
int main(void)
{
unsigned char str[STR_LEN + 1] = {0};
const char *hex_digits = "0123456789ABCDEF";
int i;
for( i = 0 ; i < STR_LEN; i++ ) {
str[i] = hex_digits[ ( rand() % 16 ) ];
}
printf( "%s\n", str );
return 0;
}
答案 3 :(得分:0)
您的代码中存在一些不清楚和问题。我将“十六进制字符”解释为“十六进制数字”,即来自{0,1,2,3,4,5,6,7,8,9,a,b,c,d,e,f}的符号,而不是“ascii字符的代码点的十六进制值”。这可能是也可能不是你的意思。
这应该这样做:
void hex_fill(char *buf, size_t max)
{
static const char hexdigit[16] = "0123456789abcdef";
if(max < 1)
return;
--max;
for(i = 0; i < max; ++i)
buf[i] = hexdigit[rand() % sizeof hexdigit];
buf[max] = '\0';
}
以上将永远0终止字符串,因此不要求您事先这样做。它将正确处理所有缓冲区大小。