使用to_string、reverse、stoi组合的C++反转编号给出运行时错误实例超出范围
C++ Reversing Number using to_string, reverse, stoi combo giving runtime error Instance Out of Range
由于实例超出范围异常,在试图解决运行时错误时被卡住。我将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;
}
请注意,还需要更改返回类型。
- 为什么在全局范围内使用"extern int a"似乎不行?
- 尝试通过多个向量访问变量时,向量下标超出范围
- 错误:未在此范围内声明'reverse'
- 正在将指针转换为范围
- 使用std::transform将一个范围的元素添加到另一个范围中
- 在基于范围的for循环中使用结构化绑定声明
- 如何计算数据类型的范围,例如int
- 为什么 const std::p air<K,V>& 在 std::map 上基于范围的 for 循环不起作用?
- 在C++中查找范围的长度
- 如何设置一个范围来提取我想要获得的信息
- 并行用于C++17中数组索引范围内的循环
- 为左值和右值的包装器实现C++范围
- 求出有多少个数字是完美平方,而sqrt()是L,R范围内的素数
- 关于:C++中异常对象的范围:为什么我没有得到副本?
- 超出范围时使用对象
- 不计算一个范围内的完美数
- ";结果类型必须是可从输入范围的值类型""构造的;创建std::vector时
- 使用to_string、reverse、stoi组合的C++反转编号给出运行时错误实例超出范围
- "1L << count"是什么意思?如何使用超出"unsigned long long int? "范围的语句编号打印?
- 循环计数某个范围内的事件编号时总是返回1