0

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] = ランダムな文字 final [1] = ランダムな文字 final [2] and final [3] = short 配列 final [4] = 別の文字 ....

私の問題は、短い int の 2 バイトを最終的な配列の 2 バイトにコピーしたいということです。

ありがとう。

4

8 に答える 8

5

私は混乱しています-問題はstrlen(dest)+6、文字列の長さfinalを10文字(およびヌルターミネータ)に制限していると言っていることです。あなたが言うならstrlen(dest)+8、完全な文字列のための十分なスペースがあります。

アップデート

ショートのサイズは2バイトしかない場合でも、文字列として出力される場合、各文字は1バイトを占めます。つまり、10000を超える数値を書き込む場合、文字列にshortを書き込むには最大5バイトのスペースが必要になる可能性があります。

これで、フォーマット指定子を使用して文字列に16進数としてshortを書き込む場合、%x2バイトを超えることはありません。

于 2010-06-01T19:30:06.083 に答える
1

11 文字ではなく、13 文字分のスペースを割り当てる必要があります。終端の NULL を忘れないでください。

于 2010-06-01T19:30:58.047 に答える
1

short 変数は 2 バイトかかると考えているため、1 バイトを失います。ただし、数字文字 ('5'、'0'、'0') ごとに 1 つ、つまり 3 つ必要です。'\0'また、ターミネータ (+1 バイト)が必要です。

==>あなたが必要ですstrlen(dest) + 8

于 2010-06-01T19:32:34.160 に答える
1

Unsigned shorts は 5 文字までですよね?(0 - 65535)

unsigned shortすべての値をカバーするには、5 文字を割り当てる必要があるようです。

これを使用することを指します:

char* final = (char*) malloc(strlen(dest) + 10);
于 2010-06-01T19:32:35.323 に答える
1

数値 (500) をフォーマットすると、1 つではなく 3 つのスペースが必要になります。したがってsnsprintf、最終的な長さを として指定する必要がありますstrlen(dest)+5+3。次に、呼び出しを修正mallocして調整します。数値の を計算する場合strlenは、次のような呼び出しで実行しますstrlen(itoa(val))。また、dest の最後にある NULL を忘れることはできませんが、strlen はこれを考慮していると思いますが、よくわかりません。

于 2010-06-01T19:33:44.843 に答える
1

簡単な答えは、 strlen(dest) + 6 文字に十分なスペースしか割り当てていないということですafter + dest (5 文字) = 11 文字を割り当てた場合は 13 文字。

于 2010-06-01T19:33:48.387 に答える
0

主な誤解のように思われるのは、「2バイト」のショートは画面上で21バイトの文字として表現できないということです。

まず、十分なスペースを残します。

char* final = (char*) malloc(strlen(dest) + 9);

1バイト文字の可能な値の全範囲は印刷できません。これを画面に表示して読みやすくしたい場合は、次のように2バイトのshortを4hexバイトとしてエンコードする必要があります。

## 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); 

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

于 2010-06-01T20:14:06.333 に答える
0

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);
于 2010-06-01T19:32:44.357 に答える