2

我有一个字符串...“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;
}
4

3 回答 3

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字符。请仔细阅读文档。)

于 2013-10-26T21:43:57.247 回答
1

您将 j 增加两次:

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

此外,看起来您可能会-在长度为三的倍数的字符串末尾得到两个 s,因为您正在检查j <= str.length()而不是j < str.length()Try:

for(size_t j = 0; j < str.length(); j+=3){
    str_substr += str.substr(j,3) + '-';
}
cout << str_substr;
于 2013-10-26T21:44:26.593 回答
0

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

#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)。

于 2013-10-26T21:56:11.570 回答