短い整数のフォーマット仕様
-
22-10-2019 - |
質問
Cの形式指定器を正しく使用しません。数行のコード:
int main()
{
char dest[]="stack";
unsigned short val = 500;
char c = 'a';
char* final = (char*) malloc(strlen(dest) + 6);
snprintf(final, strlen(dest)+6, "%c%c%hd%c%c%s", c, c, val, c, c, dest);
printf("%s\n", final);
return 0;
}
私が欲しいのはコピーすることです
final [0] =ランダムチャーファイナル[1] =ランダムチャーファイナル[2]およびfinal [3] =ショートアレイファイナル[4] =別のchar ....
私の問題は、短いINTの2バイトを最終配列の2バイトにコピーしたいということです。
ありがとう。
解決
私は混乱しています - 問題はあなたが言っていることです strlen(dest)+6
の長さを制限します final
10枚の文字列(プラスヌルターミネーター)。あなたが言うなら strlen(dest)+8
その後、完全な文字列に十分なスペースがあります。
アップデート
短い場合はサイズが2バイトしかありませんが、文字列として印刷すると、各文字はバイトを取り上げます。つまり、10000を超える数字を記述している場合、文字列に短く書くために最大5バイトのスペースが必要になる可能性があります。
さて、あなたが次のように文字列に16進数として書く場合 %x
フォーマット仕様、2バイト以下になります。
他のヒント
13文字ではなく13文字にスペースを割り当てる必要があります。終了したヌルを忘れないでください。
フォーマットすると、数(500)が1つではなく3つのスペースを占有します。だからあなた snsprintf
最終的な長さを次のように与える必要があります strlen(dest)+5+3
. 。次に、あなたも修正します malloc
調整するために呼び出します。あなたが計算したい場合 strlen
番号のように、このような電話でそれをしてください strlen(itoa(val))
. 。また、Destの終わりにヌルを忘れることはできませんが、Strlenはこれを考慮していると思いますが、私は確信していません。
簡単な答えは、Strlen(dest) + 6文字のために十分なスペースを割り当てていることです。 After + Dest(5 chars)= 13 char 11 charsを割り当てたとき。
Unsigned short
sは最大5文字を取ることができますよね? (0-65535)
5文字を割り当てる必要があるようです unsigned short
すべての値をカバーします。
これを使用することを指します:
char* final = (char*) malloc(strlen(dest) + 10);
短い変数が2バイトを取ると思うため、1つのバイトを失います。ただし、3つが必要です。1つは、1つの桁文字( '5'、 '0'、 '0')に1つです。また、あなたは必要です '\0'
ターミネーター(+1バイト)。
==>必要です strlen(dest) + 8
6の代わりに8を使用します。
char* final = (char*) malloc(strlen(dest) + 6);
と
snprintf(final, strlen(dest)+6, "%c%c%hd%c%c%s", c, c, val, c, c, dest);
主な誤解は、「2バイト」のショートを2つの1バイト文字として画面上に表すことができないということです。
まず、十分なスペースを残してください:
char* final = (char*) malloc(strlen(dest) + 9);
1バイト文字の可能な値の全範囲は印刷できません。これを画面に表示して読みやすい場合は、次のような2バイトの短いバイトをエンコードする必要があります。
## as hex, 4 characters
snprintf(final, sizeof(final), "%c%c%4x%c%c%s", c, c, val, c, c, dest);
これをファイルに書いている場合、それは大丈夫です、そしてあなたは次のことを試すかもしれません:
## print raw bytes, upper byte, then lower byte.
snprintf(final, sizeof(final), "%c%c%c%c%c%c%s", c, c, ((val<<8)&0xFF), ((val>>8)&0xFF), c, c, dest);
しかし、それはそれを見て人間にとって意味がなく、エンディアン性に敏感です。私はそれに強くお勧めします。