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

由于实例超出范围异常,一直试图解决运行时错误。我将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: 
  

[-2 31 到+2 31 -1]

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

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

huhailongshiwo 回答:使用to_string,reverse,stoi组合的C ++反向编号给出运行时错误实例超出范围

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]来建议):

还请注意,如果abs,则对x == -2**31的初始调用具有未定义的行为,因为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;
}

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

,

将整数转换为字符串并反转可能不是此分配的最佳答案,也可能是“作弊”(@ n-pronouns-m)。您可以改用一个简单的循环:

int reverse(int x)
{
    bool negFlag = false;
    if (x < 0)
    {
        negFlag = true;
        x = -x;
    }

    int xNum = 0;
    int prevNum = 0;
    while (x != 0)
    {
        int curr_digit = x % 10;

        xNum = (xNum * 10) + curr_digit;

        //Check for integer overflow by checking if
        //reverse of the operation above != prevNum
        if ((xNum - curr_digit) / 10 != prevNum)
        {
            return 0;
        }

        //Store this number for comparing in next iteration
        prevNum = xNum;
        x = x / 10;
    }

    return (negFlag == true) ? -xNum : xNum;
}

注意:在意识到您需要检查整数溢出之后,我对我的答案进行了修正。

本文链接:https://www.f2er.com/3162100.html

大家都在问