首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >sprintf C++中的前导零填充

sprintf C++中的前导零填充
EN

Stack Overflow用户
提问于 2016-01-10 17:13:17
回答 6查看 3.2K关注 0票数 3

下面的代码打印ffffffffff

我需要的输出是16位数的长度与前导零000000ffffffffffvar1var2变量可以是不同的,所以我没有必要只填充6个零。我只需要输出到带有前导零的16位数字。我应该如何继续?

代码语言:javascript
运行
复制
#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;
}
EN

回答 6

Stack Overflow用户

发布于 2016-01-10 17:33:08

您可以通过两个步骤完成此操作:

代码语言:javascript
运行
复制
#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
EN

Stack Overflow用户

发布于 2016-01-10 17:52:29

代码语言:javascript
运行
复制
#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;
}
票数 1
EN

Stack Overflow用户

发布于 2017-07-14 05:24:26

这是一个没有中间缓冲区的简单解决方案:

代码语言:javascript
运行
复制
#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。如果只想打印有效数字,因此没有零值的数字,则可以按以下方式修改语句:

代码语言:javascript
运行
复制
    printf("%0*x%x\n", 16 - snprintf(NULL, 0, "%.x", var2), var1, var2);

一个小区别:在%x之间添加一个.,以指定精度字段0,并将最小位数指定为none。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34703806

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档