【问题标题】:Inserting character after every nth element of a string (not using stringstream)在字符串的每个第 n 个元素之后插入字符(不使用 stringstream)
【发布时间】:2018-09-11 14:19:31
【问题描述】:

我编写了一个函数,可以从字符串中删除空格和破折号。然后它在每 3 个字符后插入一个空格。我的问题是有人可以提出不使用stringstream 的不同方法吗?

#include <iostream>
#include <string>
#include <algorithm>
#include <sstream>

using namespace std;

string FormatString(string S) {

    /*Count spaces and dashes*/

    auto newEnd = remove_if(S.begin(), S.end(), [](char c){return c == ' ' || c == '-';});
    S.erase(newEnd, S.end());

    std::stringstream ss;
    ss << S[0];

    for (unsigned int i = 1; i < S.size(); i++) {
        if (i%3==0) {ss << ' ';}
        ss << S[i];
    }

    return ss.str();
}

int main() {

    std::string testString("AA BB--- ash   jutf-4499--5");

    std::string result = FormatString(testString);

    cout << result << endl;

    return 0;
} 

【问题讨论】:

  • 为什么?使用std::stringstream 有什么问题?
  • @Someprogrammerdude 我只是好奇是否有另一种方法可以只使用迭代器和std::string::insert?我想不通?谢谢
  • 还有其他方法可以做到这一点,但它们更复杂且容易出错。使用输入字符串流或std::string::insert 既简单又直接。保持简单。

标签: c++ string stl iterator stringstream


【解决方案1】:

使用输入字符串作为输出怎么样:

#include <iostream>
#include <string>
#include <algorithm>

using namespace std;

string FormatString(string S) {
    auto newEnd = remove_if(S.begin(), S.end(), [](char c){return c == ' ' || c == '-';});
    S.erase(newEnd, S.end());

    auto str_sz = S.length();
    /* length + ceil(length/3) */
    auto ret_length = str_sz + 1 + ((str_sz - 1) / 3);
    S.resize(ret_length);

    unsigned int p = S.size()-1;
    S[p--] = '\0';
    for (unsigned int i = str_sz-1; i>0; i--) {
        S[p--] = S[i];
        if (i%3 == 0)
            S[p--] = ' ';
    }

    return S;
}

int main() {
    std::string testString("AA BB--- ash   jutf-4499--5");

    std::string result = FormatString(testString);

    cout << result << endl;
    // AAB Bas hju tf4 499 5
    return 0;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多