C ++:使用子字符串创建新字符串

时间:2013-10-26 21:37:15

标签: c++ string substr

我有一个字符串......“APPLES”,我很难使用子字符串来有效地操作字符串。我的目标是每3个字符添加一个' - '。我的问题是,当“APPLES”通过时,它返回“APP-ES-”,这是不正确的,我试图让它返回“APP-LES-”任何建议?这是我到目前为止的代码......

 for(int j = 0; j <= str.length(); j++){
    str_substr += str.substr(j,j+3);
    str_substr = str_substr + '-';
    j = j+3;
    cout << str_substr;
}

3 个答案:

答案 0 :(得分:5)

只需复制相关部分即可构建单独的字符串。

std::string s;
for(size_t i = 0; i < str.length(); i += 3) {
    s += str.substr(i, 3) + "-";
}

(请注意:str.substr(j,j+3);不正确,不会复制3个字符,会复制j + 3个字符。请仔细阅读文档。)

答案 1 :(得分:1)

你要两次增加j:

for(int j = 0; j <= str.length(); j++){
                                  ^-- once here
...
    j = j+3;
    ^-- and again here

此外,看起来你可能会在一个字符串末尾有两个-,其长度是三的倍数,因为你正在检查j <= str.length()而不是{{1}试试:

j < str.length()

答案 2 :(得分:0)

由于您显然只是将结果复制到cout,无论如何,也许最简单的方法是跳过中间字符串,只需将3个字符复制到cout,然后再写一个-,另外三个字符等等。

#include <string>
#include <iterator>
#include <iostream>

int main(){
    std::string input("APPLES");

    size_t len = 3;

    for (size_t pos = 0; pos < input.length(); pos += len)
        std::cout << input.substr(pos, len) << "-";     
}

如果您需要修改现有字符串,您可能希望首先计算要插入的破折号,然后从字符串末尾返回到开头,将每个字符直接移动到目标。如果从前面开始并在需要的地方插入破折号,它最终会成为O(N 2 )算法。从头到尾工作并将每个字符直接移动到目的地是O(N)。