7

文字列 (unsigned char) があり、16 進文字のみで埋めたいと考えています。

私のコードは

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

もちろん、これを実行するとセグメンテーション違反が発生します

4

5 に答える 5

8
  1. string はchar-s ではなくunsigned char-sの配列です
  2. への第 1 引数としてstr[i](タイプ)を使用していますが、タイプ(ポインター)が必要です。unsigned charsprintfchar *

これは少し良くなるはずです:

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()である必要がありますがchar*str[i]これcharセグメンテーション違反の原因です。コンパイラはこれについて警告を発するはずです。gcc main.c、高い警告レベルを指定せずに、次のように出力しました。

警告:sprintfの引数1を渡すと、キャストなしで整数からポインターが作成されます

文字の16進表現は、1文字または2文字(9またはABたとえば)にすることができます。フォーマットする場合は、精度を2に、塗りつぶし文字をに設定し0ます。また、終了するnullに1文字を追加し、ループ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

あなたのコードにはいくつかの不明確さと問題があります。「16 進文字」を「16 進数字」、つまり {0,1,2,3,4,5,6,7,8,9,a,b,c,d,e,f} の記号と解釈します、「ASCII文字のコードポイントの16進値」ではありません。これは、あなたが意図したものかもしれませんし、そうでないかもしれません。

これはそれを行う必要があります:

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 に答える