2016-01-10 58 views
1

下面的代碼打印ffffffffffsprintf在C中導致零填充

我需要的輸出是16位數字長000000ffffffffff與前導零。 var1var2變量可以不同,所以沒有必要僅填充6個零。我只需要輸出爲具有前導零的16位數字。我應該如何繼續?

#include <stdio.h> 

int main() { 
    int var1 = 1048575; 
    int var2 = 1048575; 

    char buffer[100]; 

    sprintf(buffer, "%x%x", var1, var2); 
    printf("%s\n", buffer); 

    return 0; 
} 
+2

C++不是C不是C++! – Olaf

+0

'%016X'應該可以工作... –

回答

1

你可以做的兩個步驟:

#include <stdio.h> 

int main(void) { 
    int var1 = 1048575; 
    int var2 = 1048575; 
    int length = 0; 
    char buffer[100]; 
    char paddedbuffer[100] = "000000000000000"; 
    length = sprintf (buffer, "%x%x", var1, var2); 
    char* here = length < 16 ? paddedbuffer + 16 - length : paddedbuffer; 
    sprintf(here, "%s", buffer); 
    printf("%s\n", paddedbuffer); 
    return 0; 
} 

有可能的地方更優雅的解決方案。

另一種可能性是將結果轉換爲整數,並且將其與字段寬度相加,或者先計算最右邊數字的實際數字。

1
#include <stdio.h> 

int main() 
{ 
    int var1=1048575; 
    int var2=1048575; 

    char buffer [17]; 
    char zeros [] = "0000000000000000";  
    sprintf (buffer, "%x%x", var1, var2); 

    // Put the zeros in front 
    int len = strlen(buffer); 
    if (len < 16) 
    { 
     zeros[16-len] = 0x0; // Terminate the string at 16-len 
    } 
    else 
    { 
     zeros[0] = 0x0; // Terminate the string at 0 as no extra zero is needed 
    } 

    printf("%s%s\n", zeros, buffer); 

    return 0; 
} 
+0

你的'zeros'數組包含一個''0''(數字)和16個零(數字),所以你會用最多一個數字填充輸出。 ([你的解決方案的測試](http://ideone.com/w7HbbF)。) – molbdnilo

+0

@molbdnilo - ups,我有點齋戒那裏。答案已更新。 – 4386427

0

你也可以做一些小微積分來計算的顯著的位數,然後打印前導零的所需數量log_base_ 16(VAR)是對VAR的十六進制大小:

#include <stdio.h> 
#include <math.h> 

int main() 
{ 
    int var1 = 1048575; 
    int var2 = 1048575; 
    int padd = 16 - ceil(log(var1)/log(16))-ceil(log(var2)/log(16)); 
    char buffer [100]; 
    sprintf (buffer, "%0*x%x%x", padd, 0, var1, var2); 
    printf("%s\n", buffer); 

    return 0; 
} 
0

使用的'0'TMP緩衝器和一個字符串(字符數組)另一個輕微的扭曲:

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

enum { PADLN = 16, MAXC = 17 }; 

int main (void) 
{ 
    int var1=1048575; 
    int var2=1048575; 

    char tmp [MAXC]; 
    char buffer [MAXC]; 
    char zeros[] = "0000000000000000"; 
    size_t len = 0; 

    sprintf (tmp, "%x%x", var1, var2); 
    len = strlen(tmp); 
    zeros[PADLN - (len < PADLN ? len : PADLN)] = 0; 
    sprintf (buffer, "%s%s", zeros, tmp); 

    printf ("\n buffer : '%s'\n\n", buffer); 

    return 0; 
} 

輸出

$ ./bin/pad16 

buffer : '000000ffffffffff' 
0

打印var2,然後打印拼接

#include <stdio.h> 

int main(void) { 
    int var1 = 1048575; 
    int var2 = 1048575; 

    char buffer[100]; 
    char bufvar2[sizeof var2 * CHAR_BIT + 1]; 
    int len = sprintf(bufvar2, "%x", var2); 

    #define TOTAL_MIN_WIDTH 16 
    sprintf(buffer, "%0*x%s", TOTAL_MIN_WIDTH - len, var1, bufvar2); 
    printf("%s\n", buffer); 

    return 0; 
} 
1

這裏是沒有中間緩衝一個簡單的解決方案:

#include <stdio.h> 

int main(void) { 
    int var1 = 1048575; 
    int var2 = 1048575; 

    printf("%0*x%x\n", 16 - snprintf(NULL, 0, "%x", var2), var1, var2); 

    return 0; 
} 

有一個特殊的情況下,你可能想要定義精確的行爲:如果var2 == 0?上面的代碼將打印一個尾隨0。如果你想只顯著數字印刷,因此沒有零值的數字,你可以修改的說法是這樣的:

printf("%0*x%x\n", 16 - snprintf(NULL, 0, "%.x", var2), var1, var2); 

一個小的差異:添加和x一個.之間%指定的0精度場指定最小位數爲無。