web-dev-qa-db-ja.com

署名されていない文字をスプリントする方法は?

これは機能しません:

unsigned char foo;
foo = 0x123;

sprintf("the unsigned value is:%c",foo);

私はこのエラーを受け取ります:

パラメータ2を「unsigned char」から「char」に変換できません

14
Christoferw

printf()形式の文字列%uを使用:

printf("%u", 'c');
18
Ariel

問題の原因となる署名されていない文字を調べる前に、次の行をよく見てください。

sprintf("the unsigned value is:%c",foo);

Sprintfの最初の引数は常に値が出力される文字列です。その行は次のようになります。

sprintf(str, "the unsigned value is:%c",foo);

Sprintfの代わりにprintfを意味する場合を除きます。

それを修正した後、フォーマット文字列で%uを使用して、符号なし型の値を出力できます。

35
MAK

[〜#〜]編集[〜#〜]

snprintfはもう少し安全です。適切なバッファサイズが使用されるようにするのは、開発者の責任です。

これを試して :

char p[255]; // example
unsigned char *foo;
...
foo[0] = 0x123;
...
snprintf(p, sizeof(p), " 0x%X ", (unsigned char)foo[0]);
6
user195488

sprintfの動作がおかしいと思います。最初のパラメータは文字列バッファ、2番目のパラメータはフォーマット文字列、次に出力する変数です。

3
eduffy

バッファオーバーフローを簡単に引き起こす可能性があるため、sprintfは使用しないでください。

Snprintf(またはMicrosoft標準Cライブラリを使用してプログラミングする場合は_snprintf)を優先する必要があります。ローカル関数でスタックにバッファを割り当てている場合は、次のことができます。

char buffer[SIZE];
snprintf(buffer, sizeof(buffer), "...fmt string...", parameters);

データは切り捨てられる可能性がありますが、バッファをオーバーフローさせるよりも確実に望ましい方法です。

1