以下是一个简单的程序,可在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]
编辑:非常感谢你们的回复:)
答案 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格式
一起使用