sprintf在C中引领零填充

时间:2016-01-10 09:13:17

标签: c printf

以下代码打印ffffffffff

我需要输出为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;
}

6 个答案:

答案 0 :(得分: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;
}

在某处可能有更优雅的解决方案。

另一种可能性是将结果转换为具有字段宽度的整数和sprintf,或者首先计算最右边数字的实际数字。

答案 1 :(得分:1)

$email = $_POST["email"];
$name = $_POST["name"]);    
$comments = $_POST["comments"];
$categories = $_POST["category_list"];  //the problem is here  

答案 2 :(得分: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的精确字段,指定最小位数为无。

答案 3 :(得分: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;
}

答案 4 :(得分:0)

使用 tmp 缓冲区和'0' s的字符串(char数组)的另一个轻微转折:

#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'

答案 5 :(得分:0)

打印 Dim contentHeight As Integer = ChAm * 50 + 40 Dim scrollBarArea As Integer = 490 Dim viewableRatio As Double = scrollBarArea / contentHeight Dim thumbHeight As Double = scrollBarArea * viewableRatio Dim scrollTrackSpace As Integer = contentHeight - scrollBarArea Dim scrollThumbSpace As Double = scrollBarArea - thumbHeight Dim scrollJump As Double = scrollTrackSpace / scrollThumbSpace ,然后打印连接

var2