C++ 添加前导零';s到字符串,不带printf
我想在字符串中添加一个前导为零的变量。 我在谷歌上找不到任何东西,没有人提到printf, 但我想在不使用printf的情况下执行此操作 读者中有谁知道路吗C++ 添加前导零';s到字符串,不带printf,c++,C++,我想在字符串中添加一个前导为零的变量。 我在谷歌上找不到任何东西,没有人提到printf, 但我想在不使用printf的情况下执行此操作 读者中有谁知道路吗 memcpy(target,'0',sizeof(target)); target[sizeof(target)-1] = 0; 然后,在缓冲区的末尾粘贴您想要的前缀为零的字符串 如果它是一个整数,请记住log\u base10(number)+1(又称ln(number)/ln(10)+1)给出了数字的长度。您可以使用、使用或: //
memcpy(target,'0',sizeof(target));
target[sizeof(target)-1] = 0;
然后,在缓冲区的末尾粘贴您想要的前缀为零的字符串
如果它是一个整数,请记住log\u base10(number)+1
(又称ln(number)/ln(10)+1
)给出了数字的长度。您可以使用、使用或:
// assuming that `original_string` is of type `std:string`:
std::string dest = std::string( number_of_zeros, '0').append( original_string);
#包括
#包括
#包括
#包括
#包括
int main(){
std::字符串s(“12”);
s、 插入(0,3,'0');
STD::CUT< P> C++的方式是用,和< /P>
#包括
#包括
使用名称空间std;
int main()
{
常数INTA=12;
常数int b=6;
cout您可以执行以下操作:
std::cout << std::setw(5) << std::setfill('0') << 1;
std::cout如果您想要一个n_零的字段,我可以给出这一行解决方案:
std::string new_string = std::string(n_zero - old_string.length(), '0') + old_string;
例如:
旧字符串=“45”;n\u零=4;
new_string=“0045”这对我很有效。您不需要将setfill切换回“”,因为这是一个临时流
std::string to_zero_lead(const int value, const unsigned precision)
{
std::ostringstream oss;
oss << std::setw(precision) << std::setfill('0') << value;
return oss.str();
}
std::字符串到零前导(常量int值,常量无符号精度)
{
std::ostringstream oss;
oss如果要修改原始字符串而不是创建副本,可以使用std::string::insert()
结果:
00123
不,谢谢你的尝试,但我希望能够添加可变数量的零。@Guus:这是可变数量的零。但是,你可以替换(sizeof(target))如果它能让你高兴的话,请使用其他数字。@Guus:具体地说,从你下面的评论中,你想要%05d,对吗?如果缓冲区有六个字符长,这正是我的代码可以为你做的(至少零填充部分,将数字放在末尾是留给你的).不,这和sprintf差不多,但是谢谢你的输入(:不,谢谢你的输入,但是使用sprintf的方式是一样的(:似乎没有粘性。std::cout@AleksanderFularstd::setw
没有粘性。std::setfill
有粘性,但是如果没有过大的宽度来给它一些事情做,它就没有多大用处。因此,您的第一个1
获得setw(5)
,因此前面有前导零,但是setw
被放回默认值,因此第二个1
将被打印为1
。因此,00001
+1
=000011
。关键是如果以后设置setw
,您会发现前面的setfill
字符r仍然有效,因为setfill
is not sticky=>不会重置为其默认的空格。这正是我所需要的。谢谢。这不就是在不考虑“原始字符串”长度的情况下添加零吗?number\u of\u zeros=4 original\u string=“99”dest将变成:000099(而不是0099)
。如果我错了,或者我可能不理解“前导零”的真正含义,请纠正我…@lepe它以书面形式回答了这个问题。OP是否编写了它们真正的含义是另一回事。我喜欢这一点。这意味着我不必构造stringstream,它在内部结构方面有相当多的负担。非常好的解决方案打开!当(n_zero-old_string.length())时会发生什么是负数?编辑:刚刚测试过,传递负数似乎仍然有效。@Castaa字符数的参数是std::string::size_type
,与stdlib中的大多数大小类型一样,它是无符号的。因此,如果用户传递负数,它将被环绕,并将产生一个大的正数。因此,它应该“起作用”,但可能不会起到预期的/有用的作用(因此无符号大小类型不好,m'kay)。应用程序:将整数填充到20个字符:auto padded=std::To_string(num);padded.insert(0,20U-std::min(std::string::size_type(20),padded.length()),'0');
如果要填充的字符串太长,min
可以防止您缠绕字符串。(对于任何64位以下的整数,20个字符都不会有此问题)。需要转换为size\u type
,因为min抱怨某些平台不匹配。我希望您可以使用std::string
std::string to_zero_lead(const int value, const unsigned precision)
{
std::ostringstream oss;
oss << std::setw(precision) << std::setfill('0') << value;
return oss.str();
}
std::string s = "123";
unsigned int number_of_zeros = 5 - s.length(); // add 2 zeros
s.insert(0, number_of_zeros, '0');
00123