我有以下代码
#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? 我知道它适用于数字类型。
答案 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之前打印。