2016-01-10 57 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精度场指定最小位数为无。