我找到了这段代码,看,printf 只有一个参数。而且,它有效!我只知道 printf 是 printf("format",...); 但为什么这段代码有效?任何答案都会有所帮助。谢谢。
1 #include <stdio.h>
2
3 int main()
4 {
5 char a[]= "hello world";
6 printf(a);
7 return 0;
8 }
~
a
是格式。但是,这种用法非常危险,因为很多人忘记了这a
是一种格式,而是认为它是文字字符串。不同之处在于,如果a
碰巧包含%
,它将被解释为格式说明符,但您没有参数可用于说明符。
使用 打印单个消息字符串时printf
,您应该始终这样做:
printf("%s", a);
或者puts
在适当的时候使用。
int printf ( const char * format, ... );
是一个带有必需参数的函数,format
以及一个可以是列表或零个或多个元素的列表参数,由 表示...
。
因此,printf(a);
只需调用printf()
所需的参数即可。
a
被视为不包含格式说明符的格式字符串。
通常,printf()
将扫描格式字符串,打印任何不是格式说明符的内容。当它遇到一个说明符时,它会对其进行解码,然后从变量参数列表中获取一个参数,根据说明符对其进行格式化,然后输出,然后像这样在循环中继续,直到到达字符串的末尾。
由于a
不包含格式说明符,printf()
因此不从变量参数列表中获取任何参数。
一般来说,printf()
不应该用这种方式打印任意字符串。如果程序只打印一个字符串,你可以使用fputs()
:
fputs(a, stdout);
printf
是一个具有可变参数列表的函数。第一个参数是一个字符串,它被解析以查找格式详细信息。在您给出的示例中,没有格式详细信息(以 开头的字段%
)。因此,不再需要打印参数并且代码有效。