と関数printf()
はsprintf()
同じです。それらの動作の唯一の違いは、1つはステートメント(何かを実行する)であり、もう1つは関数式(何かに評価される)であるということです。(違いの説明については、このStackOverflowの回答を参照してください。)どちらも最初の引数としてフォーマットを取り、次にフォーマット文字列内の特殊文字の置換文字列として0個以上の追加の引数を取ります。
あなたのsprintf()
機能はよく形成されています。フォーマット文字列に番号を付けました。フォーマット文字列に一致する引数として置換文字列があります。すべてが良いです。
しかし、printf()
関数が何をしているのかを考えてください。文字列を取得します。これはたまたまの出力ですsprintf()
。sprintf()
'sに%
文字が含まれている場合printf()
は、コードに含まれていない置換文字列が必要になります。
他の人が言っているように、あなたはおそらくsprintf()
あなたのコードからを除外することができます。しかし、なぜこれが起こっているのかも理解する必要があります。
例えば:
$fmt = "%%d\n";
printf( $fmt );
printf( sprintf($fmt) );
printf( sprintf($fmt), "Hello world" );
最初のprintfは機能し、「%d」を出力します。2番目のprintfは、フォーマット文字列が置換文字列を持っている必要があることを示しているため失敗しますが、何も提供されていません。3つ目はゼロを出力します。これは、「Helloworld」を10進整数(%d
)として評価しようとすると、それが得られるためです。
変数を見ると、おそらくそのうちの少なくとも1つに%
文字が含まれていることがわかります。