7

エラーが発生します

Warning: printf() [function.printf]: Too few arguments 

私が見るコードを見る:

function twentyten_posted_on() {
    printf( 
        sprintf( '<a href="%1$s" title="%2$s" rel="bookmark"><span class="entry-date">%3$s</span></a>',
            get_permalink(),
            esc_attr( get_the_time() ),
            get_the_date()
        )
    );
}

問題に見えるのは?

4

4 に答える 4

10

と関数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つに%文字が含まれていることがわかります。

于 2012-06-18T11:48:16.220 に答える
0

フォーマッタで入力されたデータを使用しないでください。

行う

printf( "%1$s", calculated input value);

また、セキュリティの観点からも、バグの観点からも。形式はコードの一部です(データだけではありません)。入力からの派生を許可すると、コードの任意のユーザーがその実行に影響を与える可能性があります。

于 2012-06-18T11:55:16.323 に答える
0

文字どおりに使用したい場合は % 文字を 2 倍にするか、もちろん printf の使用を控える必要があります。

于 2012-06-18T11:39:13.713 に答える
-2
sprintf( '<a href="%1$s" title="%2$s" rel="bookmark"><span class="entry-date">%3$s</span></a>',
            get_permalink(),
            esc_attr( get_the_time() )

ここでは、2 つの引数を指定して sprintf を呼び出しますが、3 つのプレースホルダー と%1$s%2$sあり%3$sます。

印刷したい場合は、sprintf を除外できます。

printf( 
    '<a href="%1$s" title="%2$s" rel="bookmark"><span class="entry-date">%3$s</span></a>',
        get_permalink(),
        esc_attr( get_the_time(),
        get_the_date()
);
于 2012-06-18T11:36:50.203 に答える