2011-01-10 57 views
2

我有下面的代碼使用xlc編譯這段代碼打印出具有領先在gcc中我如何使用前導0填充數字字符串?

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

char UPC[]="123456789ABC"; 

main() 
{ 
    int rc=0; 

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

    exit(rc); 
} 

在AIX 0的

000ABC 

在SLES 11將打印使用gcc 4.3.2版[前導空格GCC- 4_3分支修訂版141291]

123456789ABC 

是否有一些格式說明符可用於字符串打印出前導0? 我知道它適用於數字類型。

+0

考慮接受的答案...你不關心尾隨「ABC」在這個例子嗎? – ephemient

+0

接受的答案將打印出ABC,因爲它將數字解釋爲十六進制。 – Joshua

回答

4

此行爲未定義,實現特定(glibc,而不是gcc)。海事組織依靠它是不好的做法。

如果你肯定知道你的字符串是數字(十六進制這裏),你可以寫:

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

但要注意的錯誤和溢出。

編輯由原始的海報:

對於十進制數字使用以下命令:

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

甜...很好地完成! – ojblass

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; 
} 
+0

queston中的代碼使用printf和sprintf。我想我可以編寫我自己的printf和sprintf版本,以我想要的方式處理它,但我希望有更清潔的東西。 – ojblass

+0

發佈了兩個其他答案。嘗試一個。 – Joshua

2

%0*s不達標。你可以做你自己的填充:

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

不太好用,它打印16個領先0的 – ojblass

+0

@objblass:哎呀,錯過了一個字符。固定。 – ephemient

1

根據printf手冊頁,0標誌具有未定義的字符串參數行爲。您需要編寫自己的代碼來填充正確數量的'0'字符。

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

打印出%s,多數民衆贊成在 – ojblass

+0

固定的錯字。也許它現在有效。 – Joshua

+0

它現在可以工作。 – ojblass

1

簡短的回答是否定的。

你的代碼,編譯時,將導致:「警告:與‘%s’的使用‘0’標誌」

的printf的手冊頁列出了可能後,「0」所使用的格式說明國旗和他們都是數字。

但是,您可以使用適當數量的空格創建一個字符串並在UPC之前打印。

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

嘿,比我更聰明。 :-) – ephemient