所以我有这个代码,它崩溃了xcode
void strrev(const std::string& str)
{
for(size_t i=str.length();i>=0;i--)
{
std::cout << str[i];
}
}
如果我i>0
,它可以正常工作但是第一个字符没有打印出来
有关i>=0
的错误的任何建议吗?
答案 0 :(得分:6)
i
属于size_t
类型(它是无符号整数),因此当i
为零且执行i--
时,其值会回绕< / em>,获得i
可存储的最高值。然后在表达式i
中使用此str[i]
导致崩溃。
您可以单独处理i
等于零的大小写。此外,由于索引从零开始,因此最高可能索引为str.length()-1
。
应该是:
for(size_t i=str.length()-1; i > 0; i--)
std::cout << str[i];
std::cout << str[0];
考虑使用反向迭代器来避免必须处理索引:
void strrev(const std::string& str)
{
for (auto rit = str.rbegin(); rit != str.rend(); ++rit)
std::cout << *rit;
}
请注意,您还可以将std::copy
与反向迭代器和std::cout
的{{3}}对象结合使用:
#include <iostream>
#include <algorithm>
#include <string>
#include <iterator>
void strrev(const std::string& str)
{
std::copy(str.rbegin(), str.rend(),
std::ostream_iterator<std::string::value_type>{std::cout});
}
或直接使用std::ostream_iterator
代替std::copy
,因此不需要反向迭代器:
std::reverse_copy(str.begin(), str.end(),
std::ostream_iterator<std::string::value_type>{std::cout});
答案 1 :(得分:2)
最好使用std::reverse
以惯用的,无索引的方式执行此操作。
#include <algorithm>
#include <iostream>
#include <string>
int main() {
std::string str = "Hello World!";
std::reverse(str.begin(), str.end());
std::cout << str << "\n"; // !dlroW olleH
}
答案 2 :(得分:0)
由于c ++中的字符串是零 - 字符串中的第一个字符是str [0] - 因此c ++字符串中最后一个字符的索引始终是str.length() - 1或str.size() -1 所以它应该是
void strrev(const std::string& str)
{
for(size_t i=str.length()-1;i>=0;i--)
{
std::cout << str[i];
}
}