文字列 (unsigned char) があり、16 進文字のみで埋めたいと考えています。
私のコードは
unsigned char str[STR_LEN] = {0};
for(i = 0;i<STR_LEN;i++) {
sprintf(str[i],"%x",rand()%16);
}
もちろん、これを実行するとセグメンテーション違反が発生します
char
-s ではなく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);
}
の最初の引数はsprintf()
である必要がありますがchar*
、str[i]
これchar
はセグメンテーション違反の原因です。コンパイラはこれについて警告を発するはずです。gcc main.c
、高い警告レベルを指定せずに、次のように出力しました。
警告:sprintfの引数1を渡すと、キャストなしで整数からポインターが作成されます
文字の16進表現は、1文字または2文字(9
またはAB
たとえば)にすることができます。フォーマットする場合は、精度を2
に、塗りつぶし文字をに設定し0
ます。また、終了するnullに1文字を追加し、ループstr
のステップを(前の値の上書きを防ぐために)の代わりにに設定する必要があります。for
2
1
unsigned char str[STR_LEN + 1] = {0};
int i;
for (i = 0; i < STR_LEN; i += 2)
{
sprintf(&str[i], "%02X", rand() % 16);
}
次のようなことを試すことができます:
#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;
}
あなたのコードにはいくつかの不明確さと問題があります。「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 で終了するため、事前にそうする必要はありません。すべてのバッファ サイズを適切に処理します。