如果类型不符合类型说明符,printf如何工作?

时间:2015-07-13 10:13:41

标签: c printf

int main()
{
printf("%c", "\n");

return 0;
}

根据类型说明符,需要一个字符。但我们正在传递它const char *。我希望它会在代码块GNU GCC编译器中给我一个警告信息,但它没有给我任何警告并打印$字符。

为什么它没有给出任何类型的警告?

3 个答案:

答案 0 :(得分:6)

您需要启用该警告。

将代码编译为test.cpp,并为#include <stdio.h>添加printf,并在gcc 4.7.2下添加正确的警告标记:

$ gcc -c -Wformat test.cpp
test.cpp: In function 'int main()':
test.cpp:5:18: warning: format '%c' expects argument of type 'int', but argument 2 has type 'const char*' [-Wformat]

答案 1 :(得分:3)

如果存在类型不匹配,则printf()会导致未定义的行为。

格式说明符应与您要打印的类型匹配。

此外,参数的数量应与违反的格式说明符的数量相匹配,这也会导致未定义的行为。

只需在编译代码时添加-Wall,您将收到以下错误:

  

警告:格式%c期望类型为int,但参数2的类型为char *

答案 2 :(得分:1)

您可以看到代码也适用于%d,%x,%u格式说明符。

为什么它在没有任何警告的情况下有效?

因为您没有在CodeBlock中启用警告。

Go to settings -> compiler and check

Enable All Common Compiler Warnings [-Wall]

现在你得到:

In function 'int main()':
warning: format '%c' expects argument of type 'int', but argument 2 has type 'const char*' [-Wformat=]|

为什么它会起作用?

使用%c,$是CodeBlocks中的输出,X是Visual Studio中的输出。所以,这听起来像未定义的行为。

Wrong format specifiers in scanf (or) printf

无论如何,如果你想要这样的第一个字符,你只能这样做:

#include <stdio.h>

int main()
{
printf("%c", *"Hello\n"); // Not asked in Question but still :)

return 0;
}

它通过取消引用const指针来打印H.