我在C ++ Builder 3和C ++ Builder 5中编译了下一个程序,它产生了不同的输出:
#include <vcl.h>
#include <stdio.h>
#pragma hdrstop
//---------------------------------------------------------------------------
#pragma argsused
int main(int argc, char* argv[])
{
const char filename[] = "C://fprintf-test.txt";
FILE *file = fopen(filename, "a");
fprintf(file, "%0*.0f\n", 7, 99999.00);
fprintf(file, "%0*.0f\n", 7, -99999.00);
fprintf(file, "%0*.0f\n", 7, -999.00);
fprintf(file, "%0*.0f\n", 7, 999999.00);
fprintf(file, "%0*.0f\n", 7, 9.00);
return 0;
}
C ++ Builder 3中的输出:
0099999
-0099999
-0000999
0999999
0000009
C ++ Builder 5中的输出:
0099999
-099999
-000999
0999999
0000009
您可以清楚地看到负值的0填充不同。为什么是这样?这有记录吗?
提前致谢
答案 0 :(得分:1)
我在gcc上试试这个:
// gcc -o test.exe test.c
#include <stdio.h>
int main(int argc, char* argv[])
{
printf("%0*.0f\n", 7, 99999.00);
printf("%0*.0f\n", 7, -99999.00);
printf("%0*.0f\n", 7, -999.00);
printf("%0*.0f\n", 7, 999999.00);
printf("%0*.0f\n", 7, 9.00);
return 0;
}
结果如下:
0099999
-099999
-000999
0999999
0000009
printf文档说:
width:要打印的字符的最小数量如果值为 打印比这个数字短,结果是填充[...] 即使结果较大,也不会截断值。
他们谈论角色(减去角色)。
我不知道C ++ builder。查看printf C ++ builder文档差异V3 / 5。 (这可能是V3中的一个错误...)
答案 1 :(得分:0)
正如@chux在评论中所述:这可能是一个C ++ Builder 3错误。它没有记录。
如果有人遇到这个问题,我们就这样解决了:
fprintf(FileOut, "%0*.*f\n",
#if ( __BORLANDC__ >= 0x560 )
paddingNumber,
#else
paddingNumber < 0 ? paddingNumber - 1 : paddingNumber,
paddingNumber )