NULL終端していない文字列を%sしたい。

  • デル株式会社
  • NULL終端でない構造体や文字を%sでやると当たり前ですが文字化けします。
    %sはNULLが見つかるまで文字を探すからです。
    char a[5]={NULL}; ってやると、
    アドレスの中身は以下のようになります。
       [0]   [1]   [2]   [3]   [4]
    ┌──┬──┬──┬──┬──┬──┐
    │\0  │\0  │\0  │\0  │\0  │??? │
    └──┴──┴──┴──┴──┴──┘
    [4]の隣のアドレスは大抵の場合、0xcc 「フ」が入っています。
    (保障されてるわけではないので実際何が入ってるかわからない)
    なので、「フフフフ・・・」と出てくるわけです。

    通常はNULL終端でない文字列のサイズ+1の変数を作ってそいつに入れてから%sするのですが
    どうしてもよけいな変数つくりたくないって人、%sで出したいって人は
    %.?s を使います。?は出したい文字数分の数字を入れます。
    サンプル作ったので見ておいてください。

    ↓さんぷる
    -----------------------------------
        char str[5]={NULL};
        memcpy(str,"aaaaa",5);

        size_t nlen = sizeof(str);
        char pri[999]={NULL};
        sprintf(pri,"%%.%ds\r\n",nlen);
        printf(pri,str);
        printf("%5s\r\n",str);
        printf("%s\r\n",str);
    -----------------------------------
    [実行結果]
    aaaaa
    aaaaaフフフフフフフン齷ク?
    aaaaaフフフフフフフン齷ク?
    -----------------------------------
    %.5s とすると、その指定数の文字数でぶった切られるものです。
    ただ、「5」って直打ちしたくないので
    「%.5s」を変数にいれてprintfに指定しているところに注目してください。

    まあ、サイズ+1の変数作ってそれに突っ込んだほうが早い事のほうが多そうですがね。

    %sや%dとか使うところではどこでも使えます。

    以上

    関連記事

    ページ上部へ戻る