7

我有一个字符串(无符号字符),我想只用十六进制字符填充它。

我的代码是

unsigned char str[STR_LEN] = {0};
for(i = 0;i<STR_LEN;i++) {
    sprintf(str[i],"%x",rand()%16);
}

当然,在运行时我会出现段错误

4

5 回答 5

8
  1. 字符串是char-s 不是unsigned char-s的数组
  2. 您正在使用str[i](类型unsigned char为 )作为 的第一个参数sprintf,但它需要类型char *(指针)。

这应该会好一点:

char str[STR_LEN + 1];
for(i = 0; i < STR_LEN; i++) {
    sprintf(str + i, "%x", rand() % 16);
}
于 2012-08-24T13:29:59.403 回答
2

第一个参数sprintf()应该是a char*,但是str[i]是a char这是导致分段错误的原因。编译器应该对此发出警告。gcc main.c,未指定高警告级别,发出以下内容:

警告:传递 sprintf 的参数 1 使指针从整数而不进行强制转换

一个字符的十六进制表示可以是 1 个或 2 个字符(9AB例如)。对于格式设置,将精度设置为2并将填充字符设置为0。还需要为终止 null 添加一个字符并将循环str的步骤设置为而不是(以防止覆盖先前的值):for21

unsigned char str[STR_LEN + 1] = {0};
int i;

for (i = 0; i < STR_LEN; i += 2)
{
    sprintf(&str[i], "%02X", rand() % 16);
}
于 2012-08-24T13:22:28.323 回答
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;
}
于 2012-08-24T13:29:06.470 回答
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 结束字符串,因此不需要您提前这样做。它将正确处理所有缓冲区大小。

于 2012-08-24T13:33:37.133 回答
0

我对以下一些答案的变体;请注意时间播种 rand 函数,而不是使用 const 大小的 char,我使用一个向量,然后将其转换为字符串数组。

Boost 变量生成器文档

std::string GetRandomHexString(unsigned int count)
{
    std::vector<char> charVect = std::vector<char>(count);
    //Rand generator
    typedef boost::random::mt19937 RNGType;
    RNGType rng(std::time(nullptr) + (unsigned int)clock()); 
    //seeding rng
    uniform_int<> range(0, 15); //Setting min max
    boost::variate_generator<RNGType, boost::uniform_int<> >generate(rng, range); //Creating our generator
    //Explicit chars to sample from
    const char hexChars[16] = { '0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F' };
    //
    for (int i = 0; i < count; i++)
    {
        charVect[i] = hexChars[generate()];
    }
    //
    return std::string(charVect.begin(), charVect.end());;
}

示例(计数 = 32):

  • 1B62C49C416A623398B89A55EBD3E9AC
  • 26CFD2D1C14B9F475BF99E4D537E2283
  • B8709C1E87F673957927A7F752D0B82A
  • DFED20E9C957C4EEBF4661E7F7A58460
  • 4F86A631AE5A05467BA416C4854609F8
于 2022-01-04T01:03:50.620 回答