実行時に文字列の長さがわかっていると仮定して、printfを使用してnullで終了していない文字列を出力するにはどうすればよいですか?
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の回答 を参照してください。
@KennyTMによって提供される答えは素晴らしいですが、微妙です。
一般に、文字列がnullではないが「終了」しているが、途中にnull文字がある場合、printf("%.*s", length, string);
は期待どおりに機能しません。これは、%.*s
フォーマット文字列はprintf
にexactlylength
文字ではなく最大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