2

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

printf((char *) 缓冲区);

我得到的错误信息是:

cc1:格式不是字符串文字,也没有格式参数...

我怀疑有一些库我忘记安装了,因为我能够在另一台机器上编译和运行代码而没有错误......

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

4

4 回答 4

5

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

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

于 2009-07-22T20:00:02.750 回答
4

尝试

printf("%s", (char*) 缓冲区);

;-)

于 2009-07-22T19:45:49.910 回答
1

此警告由 gcc 生成,如果

-Wformat-nonliteral

已设置。它不是-Wallor的一部分-Wextra(至少对于 4.4.0 版而言),所以如果您希望代码编译无警告,只需将其删除。

于 2009-07-22T20:08:42.903 回答
0

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

但是,您几乎不想将字符串文字以外的任何内容作为第一个参数传递给 printf。这样做是一个可怕的想法,编译器有一个特殊的内置检查来警告你,原因是:假设你作为第一个参数传递给 printf 的非文字字符串恰好包含 printf 格式字符。然后 printf 将尝试访问您实际上没有传入的第二、第三、第四等参数,并且尝试这样做可能会使您的程序崩溃。如果非文字的第一个参数实际上是用户提供的,那么问题会更糟,因为恶意用户可能会随意使您的程序崩溃。

于 2009-07-22T19:54:16.897 回答