【发布时间】:2020-02-07 04:05:15
【问题描述】:
在 CodeWars 上尝试反转字符串中单词的字母(由空格分隔的单词,即单词),在 C++ 中获得乐趣。 "Hello my friend" --> "olleH ym dneirf",不会丢失多余的空格。
我的答案未通过测试,但是当我区分我的答案和建议的答案时,没有输出。我还尝试检查原始字符串和反转字符串的长度,它们的长度存在显着差异,具体取决于字符串。但是,当我比较输出时,它们的长度再次相同,并且没有尾随空格。
int main() {
std::string s("The quick brown fox jumps over the lazy dog.");
std::cout <<"Old: "<<s<<std::endl;
std::cout <<"New: "<<reverse(s)<<std::endl;
//lengths are not the same
std::cout <<"Length of s: "<<s.length()<<std::endl;
std::cout <<"Length of reverse(s): "<<reverse(s).length()<<std::endl;
//check for trailing whitespace
std::cout <<"Last 5 chars of reverse(s): "<<reverse(s).substr(reverse(s).length() - 6)<<std::endl;
}
std::string reverse(std::string str) {
std::string word;
std::string revWord;
std::string result;
char space(' ');
int cursor = 0;
for(int i = 0; i < str.length(); i++){
std::string revWord;
if (str[i] == space || i == str.length() - 1){
if (i == str.length() - 1)
i++;
word = str.substr(cursor, i - cursor);
for(int j = word.length(); j >= 0; j--){
revWord.push_back(word[j]);
}
word = revWord;
if(i != str.length() - 1)
result.append(word + " ");
cursor = i+1;
}
}
return result;
}
控制台输出:
Old: The quick brown fox jumps over the lazy dog.
New: ehT kciuq nworb xof spmuj revo eht yzal .god
Length of s: 44
Length of reverse(s): 54
Last 5 chars of reverse(s): .god
有什么想法吗?
【问题讨论】:
-
您将单词之间的字符加倍。 Fwiw,您的计算中还包括终止符。该控制台输出 不是 我所看到的。我看到:
New: ehT kciuq nworb xof spmuj revo eht yzal .god,并注意前导空格和单词之间的双空格。您不只是使用迭代器和std::reverse仅限于每个单词的任何特殊原因? -
那些不是空格,而是
\0。但是我的终端也将它们显示为空格。 -
在我之前的评论中提到,something like this。有点骇人听闻。要做到这一点需要
std::find和std::isspace,但你明白了。
标签: c++ string substring reverse