我有一个字符串......“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;
}
答案 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)。