C 警告:';0';以精度和‘;%忽略标志i’;gnu_printf格式
在UbuntuKarmic上使用GCC4.4.1编译一些遗留C代码时,我收到了以下警告 警告是: src/filename.c:385:警告:“0”标志 以精确和“%i”忽略 gnu_printf格式 导致发出警告的代码段是:C 警告:';0';以精度和‘;%忽略标志i’;gnu_printf格式,c,gcc,ubuntu,C,Gcc,Ubuntu,在UbuntuKarmic上使用GCC4.4.1编译一些遗留C代码时,我收到了以下警告 警告是: src/filename.c:385:警告:“0”标志 以精确和“%i”忽略 gnu_printf格式 导致发出警告的代码段是: char buffer[256] ; long fnum ; /* some initialization code here ... */ sprintf(buffer, "F%03.3i.DTA", (int)fnum); /* <-
char buffer[256] ;
long fnum ;
/* some initialization code here ... */
sprintf(buffer, "F%03.3i.DTA", (int)fnum); /* <- warning emitted here */
char缓冲区[256];
长fnum;
/*这里有一些初始化代码*/
sprintf(缓冲区,“F%03.3i.DTA”,(int)fnum);/* 从printf(3)
手册页:
0 The value should be zero padded. For d, i, o, u, x, X, a, A, e,
E, f, F, g, and G conversions, the converted value is padded on
the left with zeros rather than blanks. If the 0 and - flags
both appear, the 0 flag is ignored. If a precision is given
with a numeric conversion (d, i, o, u, x, and X), the 0 flag is
ignored. For other conversions, the behavior is undefined.
因此,您可以使用零填充或最小位数,但不能同时使用两者。您的理解是什么?解决此问题的正确方法显然是删除零。我的理解是,数据类型和格式说明符之间存在不兼容(这很可能是因为试图用精度格式化整数值)。不,整数值说明符的精度是有效的。如手册页所述,它用于给出用于格式化的最小位数。您不能只使用printf(“%0*d”,3,(int)fnum)?对不起,但是。。。如果我们不独立于值的长度来表示字段的长度,我们如何用零填充?@sylvanulg:指定精度会导致printf()
用0
填充该长度。只需确保精度大于或等于字段宽度。