linux中的printf问题

linux中的printf问题,linux,printf,Linux,Printf,下面是一个在HP和Linux上打印格式化“1.2”的简单程序。 然而,行为是不同的。 我不想让问题变得更大,但实际发生这种情况的程序在字符串中有一个浮点值,因此使用%f不是一个选项(甚至使用sprintf) 以前有人遇到过这种情况吗?哪种行为是正确的 这不应该是编译器的问题,但仍然在gcc、icpc、icc、g++上尝试过 #include <stdio.h> int main() { printf("%s = [%010s]\n", "[%010s]", "1.2");

下面是一个在HP和Linux上打印格式化“1.2”的简单程序。 然而,行为是不同的。 我不想让问题变得更大,但实际发生这种情况的程序在字符串中有一个浮点值,因此使用%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]
#包括
int main()
{
printf(“%s=[%010s]\n”、“[%010s]”、“1.2”);
返回0;
}
**惠普:**
cc test2.c-ot/T
[%010s]=[00000001.2]
**Linux:**
icc test2.c-ot/T
[%010s]=[1.2]

编辑:非常感谢大家的回复:)

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

因此,在基于glibc的系统上,不能期望带有
s
0
标志在字符串中填充
0
s。

如果不希望前导零填充,请省略前导零填充指示器:

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

有些令人惊讶的是,一个实现允许用零填充字符串,但它很容易被纠正。

根据
man
页面,对于d、i、o、u、x、x、a、a、e、e、f、f、g和g转换以外的任何东西,
0
标志的行为都是未定义的。所以两者都很好

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

根据
printf
的文档,您所做的操作的结果是未定义的行为。两个操作系统产生不同结果的事实并不意外

事实上,在Ubuntu上使用GCC4.5.2编译代码会给出以下警告:

警告:“0”标志与“%s”gnu_printf格式一起使用


我认为这里的关键是行为是未定义的,所以他在HPUX和Linux之间得到不同结果的事实是完全可以理解的。这是Linux移植项目的一部分。因此,固有的要求是我们需要完全匹配HP的功能:(在我们的案例中,HP中的行为是参考。可能是我已经探索了使用sprintf使用%f的选项,并将其存储为0填充字符串,然后使用printf。我需要前面的0填充:)