如何在 C sprintf 中添加用户定义的变量前导零?

How to add user defined variable leading zeros in C sprintf?

我正在开发一个程序,我需要在其中为 3 个数字添加前导零

所以代码看起来像这样

#include <iostream>
using namespace std;

// Check Examples


//Compiler version g++ 6.3.0

int main()
{
    
    long int num =5;
    
    char CNum[10];
    
    sprintf(CNum,"%03ld",num) ;
    
    std::cout << CNum;
    
    return 0;
}

// Outputs 005

现在让我们定义一个名为

的整数变量中前导零的数量

int blank = 3

之后的代码应该是这样的

#include <iostream>
using namespace std;

// Check Examples


//Compiler version g++ 6.3.0

int main()
{
    int blank = 3;
    long int num =5;
    
    char CNum[10];
    
    sprintf(CNum,"%03ld",num) ;
    
    std::cout << CNum;
    
    return 0;
}

然后我像这样编辑了 sprintf 参数

sprintf(CNum,"%0%dld",blank,num);

这输出

%dld

而不是

005

现在,我的主要问题是,

  1. 我可以在 sprintf 中像这样添加用户变量定义的前导零吗?

    1. 如果是,我怎样才能让我的代码做到这一点?

    2. 如果否,是否有任何其他方法可以执行相同的操作以获得所需的输出?

谢谢,期待您的回复...

一种简单而灵活的方法是在运行时构建您自己的格式字符串,例如:

#include <iostream>
#include <string>

int main ()
{
    long int num = 5;
    int n_zeroes = 3;
    
    std::string fmt = "%0" + std::to_string (n_zeroes) + "ld";
    
    char CNum [10];
    sprintf (CNum, fmt.c_str (), num) ;
    
    std::cout << CNum;
}    

Live demo

尝试理解以下代码 - 它会解决您的问题:

#include <iostream>
#include <string.h>
using namespace std;
// Check Examples

//Compiler version g++ 6.3.0

int main()
{
    int blank = 3;
    long int num =5;
    unsigned int i = 0;

    char blankZeros[16];
    char numStr[16];
    char CNum[16];

    sprintf(numStr,"%ld",num);
    for (i = 0; i < blank - strlen(numStr); i++)
        blankZeros[i] = '0';        // adding a zero
    blankZeros[i++] = '[=10=]';         // end of string sign

    sprintf(CNum,"%s%s",blankZeros, numStr) ;

    std::cout << CNum;

    return 0;
}

要使宽度动态化(不在格式字符串中硬编码),您可以这样写:

sprintf(CNum,"%0*ld",blank,num); 

不同于 "%03ld" 中的硬编码宽度 3,下一个参数(必须是 int 类型)的 asterisk indicates 是取为宽度。

  1. If No, is there any other way to perform the same action to get desired output?

如果您要将结果输出到 cout,您可以直接在那里进行格式化:

std::cout << std::setfill('0') << std::setw(blank) << num;

如果想要输出至少 3 个字符,根据需要用 '0' 填充 :

sprintf(CNum,"%0*ld", blank, num);

如果想要输出至少 3 ,请根据需要用 '0' 填充:

sprintf(CNum,"%0.*ld", blank, num);

num < 0 时输出不同。


使用sprintf()容易出现缓冲区溢出。

可以沿 .

的 C++ 行使用 snprintf() 或更多