繁体   English   中英

由于第二个参数,我的 function 并不总是有效

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM