Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/72.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C printf格式字符串lint警告_C_Printf - Fatal编程技术网

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标志。对于其他转换,行为是未定义的。