質問

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 shortsは最大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); 

しかし、それはそれを見て人間にとって意味がなく、エンディアン性に敏感です。私はそれに強くお勧めします。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top