printf格式字符串lint警告

时间:2013-08-29 00:24:00

标签: c printf

我无法修复古代代码,这就是今天的问题:

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

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

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

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

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

2 个答案:

答案 0 :(得分:2)

逐一拍摄:

"%03D"期待int。 OP提供LongValue。使用long时,说明符应为"%03ld"

"%08S"期望指向char的指针。 OP提供CharStarValue。好。但是" 0"在%s中,说明符是未定义的行为。推荐"%8s"

"%+ 014.2f"期待double。好。旗帜' +',' 0'没事。

"%06.3f"期待double。好。旗帜' +',' 0'没事。

"%"应该有其他东西行为未定义。建议删除或" %%"。


到OP的2分

1正确的格式不应以单独的%结尾,但可能以配对的%%结尾。 独立%引入"如果转换规范无效,则行为未定义" C11 7.21.6.1 9。

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

答案 1 :(得分:1)

是的,你是正确的%本身就是一个错误。 <{1}}应该在格式化的输出中生成一个文字%%

可能是你的linter也在抱怨%使用%03d值。那应该是long