任何人都可以解释一下输出是什么以及如何输出?我无法理解printf()
函数参数。我想知道它们之间的区别
1和2 ,以及 3和4 printf()
语句。通常在printf()
中,我们应该将控制字符串作为第一个参数。但即使交换参数,我也能获得相同的输出吗?
#include <stdio.h>
int main()
{
char *str;
str = "%s";
printf("%s\n", str); //.....1
printf(str, "%s\n"); //.......2
printf(str, "K\n"); //.......3
printf("K\n", str); //........4
return 0;
}
答案 0 :(得分:2)
最好将代码放入编译器并查看输出。它可能会提供更好的洞察力,而不是在Stack Overflow中提出要求。
预期输出为:
[%s \ n],因为str包含%s,它将按原样打印。
[%s \ n],因为str包含格式,第二个参数将被打印。如果str来自用户,则此表格非常危险。
[K \ n]与2相同。
[K \ n] str被忽略。如果通过命令行参数正确配置,gcc将发出警告。
结论 - 始终使用#1。
答案 1 :(得分:1)
printf
函数参数由
(1)初始
shift state
(2)format string
(3)list of arguments
在你的情况下,你有:
printf("%s\n",str); //.....1
没有移位,一个格式字符串,它带有刺痛str
= %s
并按字面打印。
printf(str, "%s\n");//.......2
str
的值没有数字移位(再次0
)和打印的文字%s
。
printf(str, "K\n"); //.......3
您再次获得str
和初始转移0
的值,但包含打印的文字格式字符串K
。
printf("K\n",str); //........4
最后,您有一个格式字符串,其转换说明符数量不足,会生成警告:
foo.c:11:1: warning: too many arguments for format [-Wformat-extra-args]
printf("K\n",str); //........4
但其中包含再次打印的文字格式字符串K
。总之,代码的输出是:
%s
%s
K
K