在gcc中如何填充前导0的数字字符串?

时间:2011-01-10 18:49:29

标签: c printf padding

我有以下代码

#include <stdio.h>
#include <stdlib.h>

char UPC[]="123456789ABC";

main()
{
  int rc=0;

  printf("%016s\n",UPC);

  exit(rc);
}

在使用xlC编译器的AIX上,此代码打印出前导0的

0000123456789ABC

在Sles 11上,它使用gcc版本4.3.2打印前导空格[gcc-4_3-branch revision 141291]

123456789ABC

是否有一些格式说明符可用于字符串打印出前导0? 我知道它适用于数字类型。

7 个答案:

答案 0 :(得分:5)

printf("%.*d%s", (int)(w-strlen(s)), 0, s);

答案 1 :(得分:4)

此行为未定义,特定于实现(glibc,而不是gcc)。依靠IMO是不好的做法。

如果你确定你的字符串是数字(这里是十六进制),你可以写:

 printf("%016llX\n",strtoll(UPC,NULL,16));

但要注意错误和溢出。

按原创海报编辑:

对于十进制数字,请使用以下内容:

printf("%016llu\n",strtoll(UPC2,NULL,10));

答案 2 :(得分:2)

printf而言,s转换说明符上的0标志的效果是未定义的。您是否仅限于printf

[编辑] 如果您愿意,这里有一个替代方案(大多数错误检查都会丢失..):

#include <stdio.h>
#include <string.h>

int main(int argc, char **argv)
{
    char    UPC[] = "1234567890ABCDEF",
        out[sizeof UPC + 12]; /* substitute size for whatever you wish here, just make sure the original string plus NUL fits */
    if(sizeof out <= sizeof UPC) {
        return -1; /* you bad, bad man */
    }

    memset(out, '0', sizeof out);
    memcpy(out + sizeof out - sizeof UPC - 1, UPC, sizeof UPC);

    printf("%s\n", out);
    return 0;
}

答案 3 :(得分:2)

%0*s不标准。你可以自己做填充:

char buf[16];
memset(buf, '0', sizeof(buf));
printf("%.*s%s", sizeof(buf) - strlen(UPC), buf, UPC);

答案 4 :(得分:1)

根据printf手册页,0标志对字符串参数有未定义的行为。您需要编写自己的代码来填充正确数量的'0'字符。

答案 5 :(得分:1)

 char spbuf[30];
 sprintf(spbuf, "%%.%ds%%s\n", 16 - strlen(UPC));
 printf(spbuf,"0000000000000000",UPC); /* 16 '0' characters */

答案 6 :(得分:1)

简短的回答是否定的。

您的代码在编译时会导致:“警告:'0'标志与'%s'一起使用”

printf的手册页列出了在'0'标志后可以使用的格式说明符,它们都是数字。

但是,您可以使用适当数量的空格创建一个字符串,并在UPC之前打印。