这是我的代码,它只是颠倒了句子:
#include <iostream>
#include <string>
using namespace std;
int main()
{
string sentence;
string reversedSentence;
int i2 = 0;
cout << "Type in a sentence..." << endl;
getline(cin, sentence);
for (int i = sentence.length() - 1; i < sentence.length(); i--)
{
reversedSentence[i2] = sentence[i];
i2++;
}
cout << reversedSentence << endl;
}
编译工作正常,但当我尝试运行程序时,会出现这种情况:
Type in a sentence...
[input]
/home/keith/builds/mingw/gcc-9.2.0-mingw32-cross-native/mingw32/libstdc++-v3/include/bits/basic_string.h:1067: std::__cxx11::basic_string<_CharT, _Traits, _Alloc>::reference std::__cxx11::basic_string<_CharT, _Traits, _Alloc>::operator[](std::__cxx11::basic_string<_CharT, _Traits, _Alloc>::size_type) [with _CharT = char; _Traits = std::char_traits<char>; _Alloc = std::allocator<char>; std::__cxx11::basic_string<_CharT, _Traits, _Alloc>::reference = char&; std::__cxx11::basic_string<_CharT, _Traits, _Alloc>::size_type = unsigned int]: Assertion '__pos <= size()' failed.
您的ReversedSenture
字符串为空,因此对其进行索引会调用未定义的行为。 相反,您可以使用push_back
:
for (int i = sentence.length() - 1; i >= 0; i--)
{
reversedSentence.push_back(sentence[i]);
}
还要注意,您的循环条件需要修改。 如果句子
为空,则应将static_cast
的.length()
转换为int
,然后再减去1,如下所示:
for (int i = static_cast<int>(sentence.length()) - 1; i >= 0; i--)
{
reversedSentence.push_back(sentence[i]);
}
您也可以使用一种算法来实现:
reversedSentence = sentence;
std::reverse(reversedSentence.begin(), reversedSentence.end());
这避免了语句
字符串为空时的复杂性。
您的for-loop表示i<; sentence.length()
是结束条件。 这导致它始终是true
,并且永远不会访问for循环,因为您将i
声明为sentence.length()-1
。 这总是小于sentence.length()
。
我的建议是:不要使用指数。 更喜欢尽可能使用迭代器。
for (auto iter = sentence.rbegin(); iter != sentence.rend(); ++iter)
{
reversedSentence.push_back(*iter);
}