[英]My function does not always work because of the second argument
我的麻烦是我的 function 并不总是有效,我不知道为什么。
这是我的代码:
#include <stdio.h>
#include <string.h>
#include <cstring>
#include <iostream>
#include <math.h>
#include <stdlib.h>
#include <string>
using namespace std;
void fill_zeros(std::string& fill_zeros_str, int fill_zeros_num){
if (fill_zeros_str.length()<fill_zeros_num){
int i = 0;
for (i=0;i<=((int)fill_zeros_num)-((int)fill_zeros_str.length());i++){
fill_zeros_str = "0"+fill_zeros_str;
}
}
}
int main(){
string testString = to_string(2);
fill_zeros(testString,7);
cout << testString << "\n";
return 0;
}
fill_zeros 的第二个参数(fill_zeros_num)一直不起作用,我也不知道为什么。
因为在for (i=0;i<=((int)fill_zeros_num)-((int)fill_zeros_str.length());i++)
中, fill_zeros_str
的长度会随着您添加零(减一)而变化,而且您也是给i
加一(所以,开始加一,结束减一)。 所以最好的办法是在function开头定义一个长度来存储字符串长度。
您的循环在每次迭代时修改std::string
,这会影响其length()
。 循环在每次迭代中重新评估length()
。
您需要先计算所需的零数并将该值保存到局部变量中,然后在循环中使用该变量。 此外,您的循环需要使用<
而不是<=
。
尝试这个:
void fill_zeros(std::string& str, size_t min_length){
if (str.length() < min_length){
size_t fill_zeros_num = min_length - str.length();
for (size_t i = 0; i < fill_zeros_num; ++i){
str = "0" + str;
// or: str.insert(0, "0");
// or: str.insert(0, '0');
// or: str.insert(str.begin(), '0');
}
}
}
但是,有一种更简单的方法来实现fill_zeros()
根本不涉及使用手动循环:
void fill_zeros(std::string& str, size_t min_length){
if (str.length() < min_length){
str = std::string(min_length - str.length(), '0') + str;
// or: str.insert(0, std::string(min_length - str.length(), '0'));
// or: str.insert(str.begin(), std::string(min_length - str.length(), '0'));
// or: str.insert(0, min_length - str.length(), '0');
// or: str.insert(str.begin(), min_length - str.length(), '0');
}
}
或者:
#include <sstream>
#include <iomanip>
void fill_zeros(std::string& str, size_t min_length){
if (str.length() < min_length){
std::ostringstream oss;
oss << std::setw(min_length) << std::setfill('0') << str;
str = oss.str();
}
}
在这种情况下,您可以简单地完全摆脱fill_zeros()
并将 I/O 操纵器直接应用于main()
中的std::cout
:
#include <iostream>
#include <iomanip>
int main(){
std::cout << std::setw(7) << std::setfill('0') << 2 << "\n";
return 0;
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.