web-dev-qa-db-ja.com

printfを使用してnullで終了していない文字列を印刷するにはどうすればよいですか?

実行時に文字列の長さがわかっていると仮定して、printfを使用してnullで終了していない文字列を出力するにはどうすればよいですか?

62
Mike
printf("%.*s", length, string);

他の引数と一緒に使用します。

printf("integer=%d, string=%.*s, number=%f", integer, length, string, number);
//                         ^^^^                       ^^^^^^^^^^^^^^

Cでは、出力する最大長を%.123s形式で指定できます。これは、出力長が最大123文字であることを意味します。 123*で置き換えることができるため、長さはハードコーディングされているのではなく、printfの引数から取得されます。

%.123s最大の長さを制約するだけでなく正確なの長さ、および文字列を制約するだけなので、これはstringに内部nullバイト(\ 0)が含まれないことを前提としていますそれでもヌル終了として扱われます。

内部がnullのnullで終了していない文字列を印刷する場合、単一のprintfを使用することはできません。代わりにfwriteを使用してください:

fwrite(string, 1, length, stdout);

詳細な説明は @ M.S.Doustiの回答 を参照してください。

101
kennytm

@KennyTMによって提供される答えは素晴らしいですが、微妙です。

一般に、文字列がnullではないが「終了」しているが、途中にnull文字がある場合、printf("%.*s", length, string);は期待どおりに機能しません。これは、%.*sフォーマット文字列はprintfexactlylength文字ではなく最大length文字の印刷を要求します。

OPの下のコメントで@William Pursellによって指摘されたより一般的な解決策を使用したいのですが。

fwrite(string, sizeof(char), length, stdout);

これがサンプルコードです:

#include <stdio.h>

int main(void) {
    size_t length = 5;

    char string[length];
    string[0] = 'A';
    string[1] = 'B';
    string[2] = 0;        // null character in the middle
    string[3] = 'C';
    string[4] = 'D';

    printf("With printf: %.*s\n", length, string);
    printf("With fwrite: ");
    fwrite(string, sizeof(char), length, stdout);
    printf("\n");

    return 0;
}

出力:

With printf: AB
With fwrite: AB CD
19
M.S. Dousti