所以我有这段代码,它使 xcode 崩溃
void strrev(const std::string& str)
{
for(size_t i=str.length();i>=0;i--)
{
std::cout << str[i];
}
}
如果我执行 i>0
它工作正常但是第一个字符不会被打印
关于 i>=0
有什么问题有什么建议吗?
最佳答案
问题
i
是 size_t
类型(它是一个无符号整数),所以当 i
为零且 i--
被执行,它的值环绕,使 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::ostream_iterator
std::cout
的对象:
#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::reverse_copy
而不是 std::copy
,因此不需要反向迭代器:
std::reverse_copy(str.begin(), str.end(),
std::ostream_iterator<std::string::value_type>{std::cout});
关于c++ - 反向 For 循环崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48473690/