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()它们行为的唯一区别是一个是语句(它做某事),另一个是函数表达式(它计算某事)。(有关差异的描述,请参阅此 StackOverflow 答案。)它们都将格式作为第一个参数,然后将零个或多个附加参数作为格式字符串中特殊字符的替换字符串。

你的sprintf()函数结构良好。您已经为格式字符串编号,您将替换字符串作为参数来匹配格式字符串。一切都很好。

但是考虑一下这个printf()函数在做什么。它得到一个字符串,恰好是sprintf(). 如果sprintf()'s 包含一个%字符,则printf()需要一个不包含在您的代码中的替换字符串。

正如其他人所说,您可能可以sprintf()从代码中省略 。但你也应该明白为什么会这样。

例如:

$fmt = "%%d\n";
printf( $fmt );
printf( sprintf($fmt) );
printf( sprintf($fmt), "Hello world" );

第一个 printf 起作用,并打印一个“%d”。第二个 printf 失败,因为它的格式字符串暗示它应该有一个替换字符串,但没有提供。第三个打印一个零,因为当您尝试将“Hello world”评估为十进制整数(%d)时,这就是您得到的。

查看您的变量,您可能会发现其中至少有一个具有%字符。

于 2012-06-18T11:48:16.220 回答
0

如果你想从字面上使用它们,你必须加倍 % 字符,或者当然不要使用 printf 。

于 2012-06-18T11:39:13.713 回答
0

不要在格式化程序中使用输入数据。

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

同样从安全的角度来看,以及从错误的角度来看。格式是代码的一部分(不仅仅是数据)。如果您允许它从输入派生,则代码的任意用户都可以影响其执行。

于 2012-06-18T11:55:16.323 回答
-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() )

在这里,您使用两个参数调用 sprintf,而您有三个占位符%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 回答