代码之家  ›  专栏  ›  技术社区  ›  Alex B

C++中的STL字符串填充

  •  42
  • Alex B  · 技术社区  · 15 年前

    我在用 std::string 并且需要把它们放在一个给定的宽度上。在C++中,推荐使用什么方法?

    样本输入:

    123
    

    填充到10个字符。

    样品输出:

           123
    

    (123前7个空格)

    10 回复  |  直到 5 年前
        1
  •  57
  •   bayda    15 年前

    std::setw(setwidth)操纵器

    std::cout << std::setw (10) << 77 << std::endl;
    

    std::cout << std::setw (10) << "hi!" << std::endl;
    

    输出填充77和“嗨!”.

    如果需要将结果作为字符串,请使用std::stringstream的实例,而不是std::cout对象。

    PS:负责的头文件 <iomanip>

        2
  •  36
  •   Brian R. Bondy    15 年前
    void padTo(std::string &str, const size_t num, const char paddingChar = ' ')
    {
        if(num > str.size())
            str.insert(0, num - str.size(), paddingChar);
    }
    
    int main(int argc, char **argv)
    {
        std::string str = "abcd";
        padTo(str, 10);
        return 0;
    }
    
        3
  •  21
  •   greyfade    15 年前

    我能想到的最简单的方法是使用Stringstream:

    string foo = "foo";
    stringstream ss;
    ss << setw(10) << foo;
    foo = ss.str();
    

    foo 现在应该加垫。

        4
  •  20
  •   Naveen    15 年前

    您可以这样使用它:

    std::string s = "123";
    s.insert(s.begin(), paddedLength - s.size(), ' ');
    
        5
  •  7
  •   Antti Huima    15 年前

    您可以通过调用

    string(N, ' ');
    

    所以你可以这样做:

    string to_be_padded = ...;
    if (to_be_padded.size() < 10) {
      string padded(10 - to_be_padded.size(), ' ');
      padded += to_be_padded;
      return padded;
    } else { return to_be_padded; }
    
        6
  •  5
  •   Francois Nedelec    8 年前
    std::string pad_right(std::string const& str, size_t s)
    {
        if ( str.size() < s )
            return str + std::string(s-str.size(), ' ');
        else
            return str;
    }
    
    std::string pad_left(std::string const& str, size_t s)
    {
        if ( str.size() < s )
            return std::string(s-str.size(), ' ') + str;
        else
            return str;
    }
    
        7
  •  2
  •   Andrew Grant    15 年前

    有一个简单的好方法:)

    const int required_pad = 10;
    
    std::string myString = "123";
    size_t length = myString.length();
    
    if (length < required_pad)
      myString.insert(0, required_pad - length, ' ');
    
        8
  •  1
  •   Andy Mikula Eric Mickelsen    15 年前

    怎么样:

    string s = "          "; // 10 spaces
    string n = "123";
    n.length() <= 10 ? s.replace(10 - n.length(), n.length(), s) : s = n;
    
        9
  •  0
  •   vincent thorpe    5 年前

    我之所以关注这个话题是因为我正在开发VCL;不管怎样,做一个函数并不难。

    void addWhiteSpcs(string &str, int maxLength) {
        int i, length;
    
        length = str.length();
        for(i=length; i<maxLength; i++)
        str += " ";
    };
    
    string name1 = "johnny";
    string name2 = "cash";
    
    addWhiteSpcs(name1, 10);
    addWhiteSpcs(name2, 10);
    

    在这两种情况下,它都将添加到右边的10个空格中。我建议使用像Courier或Consolas这样的单空间字体来获得正确的格式。

    当你不使用monospace字体时就会发生这种情况。
    约翰尼亚耶斯
    现金占卜

    // using monospace font the output will be
    johnny____
    cash______
    

    两个箱子的长度相同。

        10
  •  -3
  •   Salman A    15 年前

    创建一个包含10个空格的新字符串,并在这两个字符串中向后操作。

    string padstring(const string &source, size_t totalLength, char padChar)
    {
        if (source.length() >= totalLength) 
            return source;
    
        string padded(totalLength, padChar);
        string::const_reverse_iterator iSource = source.rbegin();
        string::reverse_iterator iPadded = padded.rbegin();
        for (;iSource != source.rend(); ++iSource, ++iPadded)
            *iPadded = *iSource;
        return padded;
    }