如何在 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
现在,我的主要问题是,
我可以在 sprintf 中像这样添加用户变量定义的前导零吗?
如果是,我怎样才能让我的代码做到这一点?
如果否,是否有任何其他方法可以执行相同的操作以获得所需的输出?
谢谢,期待您的回复...
一种简单而灵活的方法是在运行时构建您自己的格式字符串,例如:
#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;
}
尝试理解以下代码 - 它会解决您的问题:
#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 是取为宽度。
- 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()
或更多
我正在开发一个程序,我需要在其中为 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
现在,我的主要问题是,
我可以在 sprintf 中像这样添加用户变量定义的前导零吗?
如果是,我怎样才能让我的代码做到这一点?
如果否,是否有任何其他方法可以执行相同的操作以获得所需的输出?
谢谢,期待您的回复...
一种简单而灵活的方法是在运行时构建您自己的格式字符串,例如:
#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;
}
尝试理解以下代码 - 它会解决您的问题:
#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 是取为宽度。
- 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()
容易出现缓冲区溢出。
可以沿
snprintf()
或更多