char str[] = "テキスト"; printf ( "%.*s", strlen(str), str );
** もちろん、それらのバッファ、文字列はまだ適切にターゲットされていません
char str[] = "テキスト"; printf ( "%.*s", strlen(str), str );
** もちろん、それらのバッファ、文字列はまだ適切にターゲットされていません
いいえ、それは文字列の末尾を検出する問題を printf から strlen に移しただけで、まったく同じです。
いいえ、フィールド幅を設定しても実際には役に立ちません。
あなたが与える例では、違いはありません。printf は、装飾されていない "%s" 文字コードを、「ヌル文字が検出されるまで、文字ポインターからすべての文字を読み取って出力する」という意味として解釈します。イニシャライザchar str[] = "some text";
は null 文字を自動的に追加するため、オーバーランは発生しません。一方、以下は安全ではありません
char str[] = {'h', 'e', 'l', 'l', 'o', 'w', 'o', 'r', 'l', 'd'};
printf("%s", str);
文字シーケンスにヌル文字が追加されていないためstr
です。一方、は null に遭遇するまでの文字数をカウントして文字列の長さを決定するため、フィールド幅を指定せず strlen(str)
に使用するよりもメリットはありません。printf
結論: 文字列のフィールド幅を指定することが役立つ唯一のケースは、文字列が null で終了することが保証されていない場合です (または、 を使用sprintf
して、バッファを保持するのに十分な大きさではない可能性があるバッファに書き込むという古典的なケースです)。の内容str
) ですが、その場合、. 以外のものを使用して文字列の長さを決定する必要がありますstrlen
。
いいえ、違いはありません:
char str[] = "some text";
printf("%s", str);