C printf格式字符串lint警告
我被困在修复古代代码中,今天的问题是:C printf格式字符串lint警告,c,printf,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编
output_file_status = fprintf ( data_file, "%03d%08s%+014.2f%06.3f%",
LongValue, CharStarValue, Double1, Double2 );
Lint32产生:Lint32产生“格式错误的字符串”
1) 您是否同意格式字符串不能以%
符号结尾?我认为独立的%
没有意义
2) 当我删除尾随的%
或附加一个%
时,仍然会收到相同的警告
这是在使用Oracle Pro*C编译器(因此char饥饿值实际上是一个(char*)VarChar.arr)。是的,正确的是,
%
本身在结尾是一个错误。它应该是%%
,以便在格式化输出中生成一个文本%%
可能是您的linter也在抱怨使用了
%03d
和long
值。这应该是%03ld
是的,您正确地认为结尾处的%
本身就是一个错误。它应该是%%
,以便在格式化输出中生成一个文本%%
可能是您的linter也在抱怨使用了
%03d
和long
值。那应该是%03ld
一件一件的:
“%03d”需要一个int
。OP提供一个LongValue
。对于长的
,说明符应该是“%03ld”
“%08s”需要指向char
的指针。OP提供char饥饿值
。好啊但是对于%s
,说明符中的“0”是未定义的行为。推荐“%8s”
“%+014.2f”需要一个double
。好啊标志“+”、“0”正常
%06.3f“需要一个double
。好啊标志“+”、“0”正常
“%”应该在后面加上某物,否则行为未定义。建议删除或“%%”
到OP的2分 1正确的格式不应以单独的
%%
结尾,而可以以成对的%%
结尾。独立的
%
引入了“如果转换规范无效,则行为未定义”C117.21.6.19
2要消除所有警告,请尝试将其逐件处理: “%03d”需要一个
int
。OP提供一个LongValue
。对于长的
,说明符应该是“%03ld”
“%08s”需要指向char
的指针。OP提供char饥饿值
。好啊但是对于%s
,说明符中的“0”是未定义的行为。推荐“%8s”
“%+014.2f”需要一个double
。好啊标志“+”、“0”正常
“%06.3f”需要一个双精度。好啊标志“+”、“0”正常
“%”应该在后面加上某物,否则行为未定义。建议删除或“%%”
到OP的2分
1正确的格式不应以单独的%%
结尾,而可以以成对的%%
结尾。
独立的%
引入了“如果转换规范无效,则行为未定义”C117.21.6.19
2要消除所有警告,请尝试“%03ld%8s%+014.2f%06.3f”
谢谢你,格雷格,捕捉得好。我认为32位编译并不关心这一点(相对于64位)。我来试一试。@frododot:32位和64位是不相关的。格式字符串必须匹配参数的类型,而不仅仅是其大小。(如果类型不匹配,但大小匹配,您可能会侥幸逃脱,但它仍然不正确。)同意这是重要的类型,但32位上的a,sizeof long==sizeof int,因此lint没有抱怨。将“%03d”更改为“%03ld”不会影响lint的警告。我确实删除了终止“%”,因为这确实很讨厌:-)谢谢你,格雷格,接得好。我认为32位编译并不关心这一点(相对于64位)。我来试一试。@frododot:32位和64位是不相关的。格式字符串必须匹配参数的类型,而不仅仅是其大小。(如果类型不匹配,但大小匹配,您可能会侥幸逃脱,但它仍然不正确。)同意这是重要的类型,但32位上的a,sizeof long==sizeof int,因此lint没有抱怨。将“%03d”更改为“%03ld”不会影响lint的警告。我确实删除了终止“%”,因为这确实很讨厌:-)谢谢您的详细解释。我还不确定%08s,非常感谢您提供的参考资料。@frododot C117.21.6.1 6“标志字符及其含义是:-…+…空格…#…0表示d、I、o、u、x、x、x、a、a、e、e、f、f、g和g转换,前导零(在任何符号或基数指示之后)用于填充到字段宽度,而不是执行空格填充,转换无穷大或NaN时除外。如果同时显示0和-标志,则忽略0标志。对于d、i、o、u、x和x转换,如果指定了精度,则忽略0标志。对于其他转换,行为未定义。感谢您的详细解释ion.我也不确定%08s,非常感谢您提供的参考资料。@frododot C117.21.6.1 6“标志字符及其含义是:-…+。。。空间…#。。。0对于d、i、o、u、x、x、a、a、e、e、f、f、g和g转换,前导零(在符号或基的任何指示之后)用于填充到字段宽度,而不是执行空格填充,除非转换无穷大或NaN。如果同时出现0和-标志,则忽略0标志。对于d、i、o、u、x和x转换,如果指定了精度,则忽略0标志。对于其他转换,行为是未定义的。