打印C中的前导0?

我试图find一个很好的方式来打印前导0,如01001的邮政编码。 虽然这个数字将被存储为1001,但是这样做的好方法是什么?

我想使用任何case语句/如果然后找出多less个数字的数字,然后将其转换为一个字符数组与额外的0打印,但我不禁想到可能有办法做到这一点printf格式语法正在逃避我。

printf("%05d", zipCode); 

正确的解决scheme是将邮政编码作为STRING存储在数据库中。 尽pipe它可能看起来像一个数字,但事实并非如此。 这是一个代码,每个部分都有意义。

数字是你算术的东西。 一个邮政编码是不是。

您在最小字段宽度之前放置一个零:

 printf("%05d",zipcode); 

Zipcode是一个高度本地化的领域,许多国家在他们的邮编中都有字符,例如英国,加拿大。 因此,在这个例子中,你应该使用一个string/ varchar字段来存储它,如果在任何时候你会出货或从其他国家获得用户/客户/客户端等。

但是,在一般情况下,您应该使用build议的答案( printf("%05d", number); )。

 sprintf(mystring, "%05d", myInt); 

在这里,“05”表示“使用五位数前导零”。

如果您在* NIX机器上:

 man 3 printf 

这将显示一个手册页面,类似于:

0值应该填零。 对于d,i,o,u,x,X,a,A,e,E,f,F,g和G转换,转换后的值在左侧用零填充,而不是空白。 如果0和 – 标志都出现,0标志被忽略。 如果用数字转换(d,i,o,u,x和X)给出精度,则忽略0标志。 对于其他转换,行为是不确定的。

即使问题是针对C, 这个页面可能是有帮助的。

printf允许各种格式化选项。

例如:

 printf("leading zeros %05d", 123); 

如果您将邮政编码存储为string,而不是数字,您将为自己节省一大堆麻烦(长期)。

更灵活..下面是一个打印具有固定宽度的右alignment数字行和空格填充的示例。

 //---- Header std::string getFmt ( int wid, long val ) { char buf[64]; sprintf ( buf, "% *ld", wid, val ); return buf; } #define FMT (getFmt(8,x).c_str()) //---- Put to use printf ( " COUNT USED FREE\n" ); printf ( "A: %s %s %s\n", FMT(C[0]), FMT(U[0]), FMT(F[0]) ); printf ( "B: %s %s %s\n", FMT(C[1]), FMT(U[1]), FMT(F[1]) ); printf ( "C: %s %s %s\n", FMT(C[2]), FMT(U[2]), FMT(F[2]) ); //-------- Output COUNT USED FREE A: 354 148523 3283 B: 54138259 12392759 200391 C: 91239 3281 61423 

函数和macros的devise使printfs更具可读性。

如果您需要将邮政编码存储在字符数组zipcode []中,则可以使用以下命令:

 snprintf( zipcode, 6, "%05.5d", atoi(zipcode));