2013-06-19 255 views
1

我试图在我的sprintf语句中完成一些格式化,但似乎没有像我期望的那样工作。这里是行:使用sprintf()获取格式正确

n = sprintf(buffer, "x = %d.%d, y = %d.%d, z = %d.%d \n", x1, x2, y1, y2, z1, z2); 

在该打印输出x1是数字的整个部分,x2是小数部分。一切都会很好,除非我需要将x2,y2和z2填充为2位数 - 这意味着我需要填充前导零。

随着例子,我在网上看到的,好像这样做应该工作:

n = sprintf(buffer, "x = %d.%02d, y = %d.%02d, z = %d.%02d \n", x1, x2, y1, y2, z1, z2); 

不过,这反而会产生这样的:

x = 2.2d, y = 37.2d, z = 2.2d 

以上37实际上是X2,它显然已经转移了y1的位置。我试图在'02'周围放置括号,但是这也没有做任何事。

我试图分裂过这样的时期:(但没有工作)

n = sprintf(buffer, "x = %d. %02d, y = %d. %02d, z = %d. %02d \n", x1, x2, y1, y2, z1, z2); 

我真的不知道什么是错的......我会很感激的任何帮助。这在sprintf中并不是特别重要(我理论上可以写一些'if'语句并使它以这种方式工作),但它会很好。

谢谢!

+0

在这里正常工作。您是否曾意外地在转换中输入了'O'而不是'0'? [牵强,我知道] –

+0

@DanielFischer,以及那些粘贴从我的代码复制,我认为他们是0。我再次检查了一下:P我有一种为此快速替换的功能,但我很想知道为什么这不起作用。 – Mewa

+0

好的,如果这是一个复制粘贴,你的格式是正确的。它从这里复制粘贴,视觉检查说应该。那么,你使用的是什么编译器(和库实现)?看起来好像它没有实现所有的标志。出于好奇,它对'%d。%2d'做了什么?它是否是空间垫? –

回答

1

这是一个示例代码和输出。

float x1 = 10.12222; 
float y1 = 20.23333; 
float z1 = 30.34444; 
int xi = 10; 
int yi = 20; 
int zi = 30; 
int x0 = 5; 
int y0 = 5; 
int z0 = 5; 
int xl = 10; 
int yl = 10; 
int zl = 10; 
char chr[512]; 

printf("x = %5.2f, y = %5.2f, z = %5.2f\n", x1, y1, z1); 
printf("x = %10d, y = %10d, z = %10d\n", xi, yi, zi); 
printf("x = %010d, y = %010d, z = %010d\n", xi, yi, zi); 
printf("x = %-10d, y = %-10d, z = %-10d\n", xi, yi, zi); 
printf("x = %10.5d, y = %10.5d, z = %10.5d\n", xi, yi, zi); // DYNAMIC 

/* Dynamic formatting of DYNAMIC commented line*/ 
sprintf(chr, "Dynamic: x = %%%d.%dd, y = %%%d.%dd, z = %%%d.%dd\n", 
     xl, x0, yl, y0, zl, z0); 
printf(chr, xi, yi, zi); 

输出将是这样的。

x = 10.12, y = 20.23, z = 30.34 
x =   10, y =   20, z =   30 
x = 0000000010, y = 0000000020, z = 0000000030 
x = 10  , y = 20  , z = 30 
x =  00010, y =  00020, z =  00030 
Dynamic: x =  00010, y =  00020, z =  00030 

%x.yd装置,

X - 为对整数总字符数。

y - 在该长度内填充0。

%10.5d会给下面的结果为10,100,1000,10000 100000 100000

bbbbbbbbbb => Spaces 
    00010 
    00100 
    01000 
    10000 
    100000 
    1000000 

我希望这可以帮助你格式化。