4

だから、私は少し困惑しています。私のシステムによるとman 3 printf、文字列形式"%5s"は、指定された精度を使用して、指定された文字列引数から出力される文字数を制限する必要があります。

% man 3 printf
PRINTF(3) BSD ライブラリ関数マニュアル PRINTF(3)

名前
     printf、fprintf、sprintf、snprintf、asprintf、vprintf、vfprintf、
     vsprintf, vsnprintf, vasprintf -- フォーマットされた出力の変換

...
     ■ char * 引数は、次の配列へのポインタであることが期待されます。
             文字型 (文字列へのポインタ)。配列の文字
             終端の NUL 文字まで (ただしこれを含まない) 書き込まれます。
             テル; 精度が指定されている場合、数値以下             
             と明記してあります。精度が指定されている場合、null はありません
             文字が存在する必要があります。精度が指定されていない場合、または
             が配列のサイズより大きい場合、配列には
             終了 NUL 文字。

しかし、私のテストコードはこれを確認していません:

#include <stdio.h>
int main()
{
        char const * test = "one two three four";
        printf("test: %3s\n", test);
        printf("test: %3s\n", test+4);
        printf("test: %5s\n", test+8);
        printf("test: %4s\n", test+14);
        return 0;
}

出力します

テスト: ワン ツー スリー フォー
テスト: 2 3 4
テスト: スリーフォー
テスト: 4

私が得るべきだと思うとき

テスト: 1
テスト: 2
テスト: 3
テスト: 4

私は何か間違ったことをしていますか、それともマニュアルページが私に嘘をついているのですか?

参考までに: (一般的に) 文字列をハックし、文字列'\0'を終了するために一時的に挿入できることはわかっています (ただし、char const *ここのように、代わりにコピーする必要がある場合を除きます)、それは PITA です (特に私が同じprintfで何かの半分を印刷しようとしています)、精度が無視されている理由を知りたいです。

4

1 に答える 1

19

精度を設定しているのではなく、フィールド幅を設定しています。精度.は常にフォーマット仕様の a で始まります。

printf("test: %.3s\n", test);
于 2009-09-25T15:51:25.437 に答える