1

我一直在修复古老的代码,这是今天的问题:

output_file_status = fprintf ( data_file, "%03d%08s%+014.2f%06.3f%",
    LongValue, CharStarValue, Double1, Double2 );

Lint32 产生:Lint32 导致“格式错误的字符串”</p>

1)你们都同意格式字符串不能以%符号结尾吗?我不相信一个独立%的有意义。

2)当我删除尾随%或附加附加%时,我仍然收到相同的警告。

这是使用 Oracle Pro*C 编译器(因此 CharStarValue 实际上是 (char*)VarChar.arr )。

4

2 回答 2

2

一块一块地看:

"%03d" 需要一个int. OP 提供一个LongValue. 使用long, 说明符应该是"%03ld"

"%08s" 需要一个指向 的指针char。OP耗材CharStarValue。好的。但是说明符中的“0”对于 a来说是未定义的行为%s。推荐“%8s”

"%+014.2f" 需要一个double. 好的。标志“+”、“0”都可以。

"%06.3f" 需要一个double. 好的。标志“+”、“0”都可以。

"%" 后面应该有一些东西 else行为是 undefined。建议删除或“%%”。


给OP的2分

1 正确的格式不应以单独的 s%结尾,而可以以配对%%的 s 结尾。
独立%版本引入“如果转换规范无效,则行为未定义”C11 7.21.6.1 9.

2 要消除所有警告,请尝试"%03ld%8s%+014.2f%06.3f".

于 2013-09-06T15:58:55.587 回答
2

是的,你说得对%,最后本身就是一个错误。它应该是在格式化输出中%%产生一个文字。%

可能是您的 linter 也抱怨使用%03dwithlong值。那应该是%03ld

于 2013-08-29T00:27:07.553 回答