C char数组不是字符串模式?

时间:2009-07-22 19:43:30

标签: c printf

我在以下代码上遇到编译错误:

printf((char *)buffer);

我收到的错误消息是:

cc1:格式不是字符串文字而且没有格式参数......

我怀疑有些库我忘了安装,因为我能够在其他机器上编译并运行代码而没有错误......

PS:问题在于我能够在其他机器上运行相同的代码......我怀疑gcc版本的不同可能导致这样的问题?

4 个答案:

答案 0 :(得分:5)

较新的GCC版本尝试解析传递给printf和类似函数的格式字符串,并确定参数列表是否与格式字符串正确匹配。它不能这样做,因为你已经为第一个参数传递了一个缓冲区,它通常是一个格式字符串。

您的代码不正确C,它只是C的不良用法。正如其他人提到的那样,您应该使用“%s”作为格式字符串来打印单个字符串。如果您不控制输入,这可以保护您免受涉及字符串中百分号的一类错误的影响。除了将字符串文字作为printf或sprintf函数族的第一个参数传递之外,最好不要传递任何东西。

答案 1 :(得分:4)

尝试

printf(“%s”,(char *)buffer);

- )

答案 2 :(得分:1)

此警告由gcc if

生成
-Wformat-nonliteral

已设定。它不是-Wall-Wextra的一部分(至少对于4.4.0版本),所以如果您希望代码无需编译,请将其删除。

答案 3 :(得分:0)

这是对您安全的警告,而不是错误。这个新的编译器显然对它更加严格。我不认为它在C中实际上是非法的,因此编译器应该有一个选项来禁止将其视为错误。

但是,你几乎不想传递除字符串文字之外的任何内容作为printf的第一个参数。之所以这么做是因为编译器有一个特殊的内置检查来警告你它是这样的:假设你作为printf的第一个参数传递的非文字字符串碰巧包含printf格式化字符。然后printf将尝试访问您实际上未传入的第二个,第三个,第四个等参数,并且可能会尝试执行此操作而导致程序崩溃。如果非文字的第一个参数实际上是用户提供的,那么问题就更糟了,因为恶意用户可能会随意崩溃您的程序。