linux中的printf问题

时间:2011-09-07 05:51:09

标签: linux printf

以下是一个简单的程序,可在HP& Linux操作系统。 但是,行为是不同的。 我不想让问题更大,但实际发生这个问题的程序在字符串中有浮点值,因此使用%f不是一个选项(即使使用sprintf)。

之前有没有遇到过这个?哪种行为是正确的?

这不应该是编译器问题,但仍然在gcc,icpc,icc,g ++上尝试过。

#include <stdio.h>

int main()
{
   printf("%s = [%010s]\n", "[%010s]",  "1.2");
   return 0;
}

**HP:**
cc test2.c -o t ; ./t
[%010s] = [00000001.2]

**Linux:**
icc test2.c -o t ; ./t
[%010s] = [       1.2]

编辑:非常感谢你们的回复:)

4 个答案:

答案 0 :(得分:7)

来自glibc 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.

因此,0标记为s的标记不能在基于glibc的系统上填充0个字符串。

答案 1 :(得分:2)

根据man页面,0标志的行为除了d,i,o,u,x,X,a,A,e,E,f,F之外的任何其他内容,g和G转换未定义。所以两者都很好。

编辑:当我说“很好”时,我的意思是从编译器/ libc的角度来看。从您的应用程序的角度来看,您所依赖的行为(在Linux和HP上)都是一个错误,您应该正确地进行格式化打印。

答案 2 :(得分:1)

如果您不想要前导零填充,请省略前导零填充指示符:

printf("%s = [%10s]\n", "[%010s]",  "1.2");

有点令人惊讶的是,实现过程中使用零来填充字符串,但很容易纠正。

答案 3 :(得分:0)

根据printf的文档添加Ignacio Vazquez-Abrams所说的内容,您所做的结果是未定义的行为。两个操作系统产生不同结果的事实并不出人意料。

事实上,在Ubuntu上使用gcc 4.5.2编译代码会发出以下警告:

  

警告:'0'标志与'%s'gnu_printf格式

一起使用