所以我有这个代码,它崩溃了xcode
void strrev(const std::string& str)
{
for(size_t i=str.length();i>=0;i--)
{
std::cout << str[i];
}
}
Run Code Online (Sandbox Code Playgroud)
如果我这样做它工作正常,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];
Run Code Online (Sandbox Code Playgroud)
考虑使用反向迭代器来避免必须处理索引:
void strrev(const std::string& str)
{
for (auto rit = str.rbegin(); rit != str.rend(); ++rit)
std::cout << *rit;
}
Run Code Online (Sandbox Code Playgroud)
请注意,您还可以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});
}
Run Code Online (Sandbox Code Playgroud)
或者直接使用std::reverse_copy而不是std::copy反向迭代器:
std::reverse_copy(str.begin(), str.end(),
std::ostream_iterator<std::string::value_type>{std::cout});
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
89 次 |
| 最近记录: |