【发布时间】:2020-11-10 04:34:35
【问题描述】:
当我们在没有格式说明符的情况下向它提供多个参数时,printf() 的行为是什么?
例子:
int main()
{
printf("hello", "hi");
return 0;
}
为什么编译器在编译上述程序时会产生警告? :
warning: too many arguments for format [-Wformat-extra-args]
如果我们编译下面类似的程序:
int main()
{
char *s1 = "hello";
char *s2 = "hi";
printf(s1, s2);
}
不会产生任何警告。这是什么原因?
另外,为什么两个程序都只输出hello,而不输出hi?
【问题讨论】:
-
您错误地使用了
printf。第一个参数应该是格式字符串。后续参数应在格式字符串中具有格式说明符。例如:printf("%s %s", s1, s2);。我认为char *s1 "hello %s"; char *s2 = "hi"; printf(s1, s2);会起作用,但这是不好的做法。 -
您的编译器在第一种情况下很有帮助(并且忽略了 C 的基本规则),它尊重基本规则 “程序员知道她在做什么”第二种情况。然而,在这些 sn-ps 中,程序员实际上并不知道她在做什么(或自愿做错事(为什么??????))
-
@atul_pant 请阅读函数 printf 的描述。这对你很有用。
-
您可能认为
printf就像其他语言(Python、perl 等)中的打印函数,您可以给它许多字符串,它会打印所有字符串。它不是那样的。正如 Vlad 所说,您需要阅读它的文档,或者在线上存在的无数关于其使用的教程。 -
形式上,第一个参数应该是格式字符串,后面的参数根据嵌入在格式字符串中的格式说明符进行解释(如
%d,@ 987654332@等)。由于您的字符串"hello"不包含任何格式说明符,因此所有后续参数都将被忽略。
标签: c printf language-lawyer variadic-functions format-string