1


0

この形式のprintf APIを使用すると、より安全になりますか?
char str[] = "some text";

printf ( "%.*s", strlen(str), str );
  • もちろん、バッファ、まだ適切にターゲットとされていない文字列

4 回答


3


いいえ、それは文字列の終わりを検出する問題をprintfからstrlenにシフトするだけで、それでもまったく同じです。


1


いいえ、printfはフィールドの幅を設定しても実際には役に立たない安全なフォームオーバーランである必要があります


1


あなたが与える例では、違いはありません。 printfは、装飾されていない「%s」文字コードを、「ヌル文字が見つかるまで文字ポインターからすべての文字を読み取り、印刷する」ことを意味すると解釈します。初期化子 `char str [] =" some text ";`は自動的にヌル文字を追加するため、オーバーランは発生しません。 一方、以下は安全ではありません

char str[] = {'h', 'e', 'l', 'l', 'o', 'w', 'o', 'r', 'l', 'd'};
printf("%s", str);

文字列 `str`にヌル文字が追加されないため。 一方、 `strlen(str)`はnullに遭遇する前に文字数をカウントすることで文字列の長さを決定するため、フィールド幅を指定せずに `printf`を使用するだけの利点はありません。

結論:文字列のフィールド幅を指定することが役立つ唯一のケースは、文字列がnullで終了することが保証されていない場合です(または、 `sprintf`を使用して十分に大きくないバッファに書き込む古典的なケース「str」の内容を保持するため)、その場合は、「strlen」以外の何かを使用して文字列の長さを決定する必要があります。


0


いいえ、以下と同じです:

char str[] = "some text";
printf("%s", str);