@Lokno已經爲您提供了正確的答案。但是,讓我多挑一點你的代碼,向你展示一些其他的選擇,並糾正一些小錯誤。
首先,你實際上並沒有發佈編譯的例子,因爲你忘了展示包括頭<iostream>
和<string>
,也沒有表現出using namespace std;
那是在你的代碼暗示。
其次,對於常規for
循環,除非實際需要將其用作返回值,否則寧願將循環變量保留在循環內部。還有prefer pre-increment++i
超過後增加i++
。此外,由於您確定了正確的循環索引,因此沒有理由在未檢查的[]
版本上使用邊界檢查元素訪問at()
。
在C++ 11中,您有range-for循環,它允許使用更短和更傻的代碼,其中我還使用了auto
,您可以在其中使用char
。不幸的是,沒有反向範圍循環。如果您使用i >= 0
而不是i > -1
,則正確的基於索引的反向循環可能更易於閱讀。
然後是使用std::copy
在您使用的std::string
迭代器接口(尤其是在反向迭代rbegin()
和rend()
)通過綁定到標準輸出一個ostream_iterator
每個字符複製算法基於循環。
順便說一下,我用分隔符"|"
而不是換行符來看東西更容易,適應你的口味。在任何情況下,使用std::endl
可以有,因爲它每次刷新輸出緩衝區。
#include <algorithm>
#include <iterator>
#include <iostream> // you forgot this
#include <string> // you forgot this
int main()
{
using namespace std; // you forgot this
// let's pretend this is the string
string myAnimal = "Please enter the name of your favorite animal.";
// keep the loop variable local, prefer pre-increment
for (int i = 0; i < myAnimal.length(); ++i)
cout << myAnimal[i] << "|"; // prefer [] over at()
std::cout << "\n";
// C++11 range-for
for (auto c : myAnimal)
std::cout << c << "|";
std::cout << "\n";
// index-based reverse loop
for (int i = myAnimal.length() - 1; i >= 0; --i)
cout << myAnimal[i] << "|";
std::cout << "\n";
// algorithm-based reverse loop
std::copy(myAnimal.rbegin(), myAnimal.rend(), ostream_iterator<char>(cout, "|"));
std::cout << "\n";
// main implicitly return 0
}
Live Example。 PS:main()
成功後隱式返回0
。
您不應該使用int來存儲字符串的長度,該字符串的長度可能會超出整數範圍。 – PrinceGautham