gpt4 book ai didi

c++ - 反向 For 循环崩溃

转载 作者:太空宇宙 更新时间:2023-11-04 15:00:25 26 4
gpt4 key购买 nike

所以我有这段代码,它使 xcode 崩溃

void strrev(const std::string& str)
{
for(size_t i=str.length();i>=0;i--)
{
std::cout << str[i];
}
}

如果我执行 i>0 它工作正常但是第一个字符不会被打印关于 i>=0 有什么问题有什么建议吗?

最佳答案

问题

isize_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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com