微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何通过填充或截断另一个输入字符串来构造字符串?

如何解决如何通过填充或截断另一个输入字符串来构造字符串?

关于字符串的答案有数百万个,但我找不到适合我的问题的答案。我尝试在 cppreference.com 中找到它,但找不到针对此特定问题的解决方案。

我知道如何解决一般问题 - 它有效。但我想学习更多 C++ 并找到一个“正确”(有效)的解决方案。也许其中一位 C++ 向导可以帮助我:)

我有一个 struct,其中包含一个 double一个 string(例如变量的名称)。当我想通过构造函数初始化 struct 时,我想确保 string 中的 struct 具有固定长度。如果太长,我想截断它,如果它太短,我想填充它。我可以使用 resize()

如果可能的话,我正在寻找一种方法,可以在构造函数的初始值设定项列表中的一个步骤中有效地做到这一点。是不是我遗漏了一些巧妙的操作?

我能想到的就是把它写在构造函数函数体中:

#include <iostream>
#include <string>

using namespace std;

const uint STRING_LENGTH = 25;

struct parameter {
    double value;
    string name;
    parameter(double _value,const string& _name)
        : value(_value) // easy
    {
        string name_temp(_name);
        name_temp.resize(STRING_LENGTH,' ');
        name = name_temp;
    };
};

int main(int argc,char* argv[]) {
    parameter A(0.5,"my_variable");
    parameter B(-0.1,"my other variable with the name that is too long and has to be truncated!");

    cout << "parameter name: " << A.name << "\tis:\t" << A.value << '\n';
    cout << "parameter name: " << B.name << "\tis:\t" << B.value << '\n';
}

解决方法

我喜欢调整大小的技巧,但删除 const&(以便调用者可以std::move() 输入字符串)可能是一个稍微好一点的界面。在这里,实际函数体中最多只有一个副本(假设调用者将字符串移入),而在原始版本中,最坏的情况下只有三个。

    parameter(double _value,string _name)
        : value(_value),name(std::move(_name))
    {
        name.resize(STRING_LENGTH,' ');
    };
,

如果你真的想在构造函数的初始化列表中处理这个,写一个它可以调用的辅助函数,例如:

std::string&& fix_length(std::string &&s) {
    s.resize(STRING_LENGTH,' ');
    return std::move(s);
}

struct parameter {
    double value;
    std::string name;

    parameter(double _value,std::string _name)
        : value(_value),name(fix_length(std::move(_name)))
    {
    }
};

Online Demo

但是,如果您确实需要固定长度的字符串,请考虑使用 std::array 代替,例如:

class fixedString
{
    std::array<char,STRING_LENGTH+1> cdata;
    
public:
    fixedString(const std::string &s)
        : fixedString(s.c_str(),s.size())
    {
    }

    fixedString(const char *s)
        : fixedString(s,std::strlen(s))
    {
    }

    fixedString(const char *s,const size_t len)
    {
        std::copy_n(s,std::min<size_t>(len,STRING_LENGTH),cdata.begin());
        if (len < STRING_LENGTH)
            std::fill_n(cdata.begin()+len,STRING_LENGTH-len,' ');
        cdata[STRING_LENGTH] = '\0';
    }

    friend std::ostream& operator<<(std::ostream& os,const fixedString &fs)
    {
        os << fs.cdata.data();
        return os;  
    }
};

struct parameter {
    double value;
    fixedString name;

    parameter(double _value,const fixedString &_name)
        : value(_value),name(_name)
    {
    }
};

Online Demo

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。