使用to_string、reverse、stoi组合的C++反转编号给出运行时错误实例超出范围

C++ Reversing Number using to_string, reverse, stoi combo giving runtime error Instance Out of Range

本文关键字:编号 范围 运行时错误 实例 C++ string to reverse stoi 组合 使用      更新时间:2023-10-16

由于实例超出范围异常,在试图解决运行时错误时被卡住。我将int转换成一个字符串,反转字符串并使用stoi将其返回到int。简单的测试数字完全相反,但较大的数字超出范围。不确定要针对超出范围的异常在代码中的何处进行调整。超级卡住了,请帮忙。

int reverse(int x) {
bool negFlag = false;
if(x < 0)
{
negFlag = true;
}
string xString = std::to_string(abs(x));
std::reverse(xString.begin(), xString.end());
int xNum = std::stoi(xString);
return (negFlag == true)? -xNum: xNum;
}

这是返回的错误:

terminate called after throwing an instance of 'std::out_of_range'
what():  stoi
Last executed input:  1534236469

较小的数字效果良好。

Your input: 123
Output:     321
Expected:   321

在我的字符串末尾是否有一个\0在转换中抛出了所有内容?这些C++方法的新手。非常感谢。我真的很想把这些方法固定下来,并且能够轻松使用。

重要信息:

Note: Assume we are dealing with an environment which could only store 
integers within the 32-bit signed integer range: 

[-231到+231]

For the purpose of this problem, assume that your function returns 0 when 
the reversed integer overflows.

-->>不确定如何制定将返回0的if语句;当超过32位时

1,534,236,469的反面是9,646,324,351。典型的32位int可以容纳的最大值是2,147,483,647,所以它不适合它

你需要让你的函数返回更大的东西,例如long long(它至少是64位(,并使用适当的转换函数,例如:

long long reverse(int x) {
//...
long long xNum = std::stoll(xString);
//...
}

是否要将输入类型更改为更大的类型,取决于函数应该能够处理的最大输入值。


编辑后:

在这种情况下,您可以捕获转换错误并返回0(需要#include<stdexcept>(:

try {
int xNum = std::stoi(xString);
// Maybe insert additional range test according to assignment (?)
return (negFlag == true)? -xNum: xNum;
} catch(const std::out_of_range&) {
return 0;
}

假设int是32位二进制补码(据我所知,赋值试图用值范围来建议,假设为[-2**31, 2**31-1](:

还要注意,如果x == -2**31,对abs的初始调用具有未定义的行为,因为2**31在32位int中不可表示。因此,在调用abs之前,您需要先对此进行特殊处理,以避免未定义的行为。

类似地,您需要考虑函数的结果应该是-2**31的情况。但您可能会注意到,这种情况无关紧要,因为它对应的输入值已经超出了int的范围。

输入范围大于int所能容纳的范围。将其更改为long long,它应该可以工作。

long long reverse(long long x) {
bool negFlag = false;
if(x < 0)
{
negFlag = true;
}
string xString = std::to_string(abs(x));
std::reverse(xString.begin(), xString.end());
long long xNum = std::stoll(xString);
return (negFlag == true)? -xNum: xNum;
}

请注意,还需要更改返回类型。