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

C字符数组不是字符串模式吗?,c,printf,C,Printf,我在以下代码中遇到编译错误: printf((char*)缓冲区) 我得到的错误信息是: cc1:格式不是字符串文字,也没有格式参数… 我怀疑有一些库我忘记安装了,因为我能够在另一台机器上编译并运行代码而没有出现错误 PS:问题是我能够在其他机器上运行相同的代码。。。我怀疑gcc版本中的差异可能会导致这样的问题 试试看 printf(“%s”,(char*)缓冲区) ;-) 这是对您安全的警告,而不是错误。这个新的编译器显然对它要求更严格。我不认为这在C语言中是非法的,所以编译器应该有一个选项来

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

printf((char*)缓冲区)

我得到的错误信息是:

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

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


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

试试看

printf(“%s”,(char*)缓冲区)


;-)

这是对您安全的警告,而不是错误。这个新的编译器显然对它要求更严格。我不认为这在C语言中是非法的,所以编译器应该有一个选项来禁止将其视为错误


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

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


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

如果

-Wformat-nonliteral

一切就绪。它不是
-Wall
-Wextra
(至少对于4.4.0版)的一部分,所以如果您希望代码编译时不出现警告,请将其删除。

问题在于我能够在其他机器上运行相同的代码。。。我怀疑gcc版本中的差异可能会导致这样的问题?听起来好像其他机器不是标准的Cprintf(%s)是一种不好的做法,因为如果字符串包含任何特殊字符(%d,%s,等等),您很可能会丢弃堆栈。printf的第一个参数应该始终是字符串文本。我猜不同版本的GCC对是否允许您这样做更为严格。他们必须允许,否则他们就不符合C编译器的要求。他们不必喜欢它,他们允许它,他们只是在发生这种情况时发出警告(作为一致性实现,他们是有权利的)。他很可能是用“将警告视为错误”来编译的。这篇文章的内容听起来很像是警告而不是错误。你能提供更多关于你正在使用的编译器和你正在使用的选项的信息吗?发布“buffer”的定义我的内存在这方面有点模糊,但它通常可以将警告升级为错误。Charles,这一点你是对的(gcc 4.2.4,我以前使用过的那个对printf((char*)有更大的容忍度)缓冲区)另一方面,gcc 4.3.3将此视为一个错误。通常,您可以使用格式字符串的字符串文字执行您想要执行的操作,特别是因为语句的其余部分在编译时是固定的。在某些情况下,最好传入非文字字符串,但正如Tyler指出的his是一种危险的做法,在任何情况下都不应该以这种方式使用用户输入。我认为你解决了问题:)