首页 > 解决方案 > strtol 指向原始字符串

问题描述

#include <cinttypes>
#include <string>
#include <algorithm>
#include <iostream>
using namespace std;
uint64_t descendingOrder(uint64_t a)
{
   string str = to_string(a);
   sort(str.begin(),str.end(),[](unsigned char a , unsigned char b) { return a>b;}); 

   cout<<"sorted string:" <<str<<endl;
   cout<<"value        :"<<strtol(str.c_str(),nullptr,10)<<endl;
   return strtol(str.c_str(),nullptr,10);
}

int main()
{
  descendingOrder(9223372036854775807L);
}

sorted string:9887777655433322200
value        :9223372036854775807

为什么sorted string:value:不同?value:即使在排序之后,似乎也以某种方式获取了原始字符串。错误在哪里?是UB吗?

代码:在线代码

标签: c++strtol

解决方案


9887777655433322200 超出了long您架构的范围。

这就是为什么errno设置为ERANGE并且LONG_MAX(恰好是您的输入)被返回的原因。请注意,实现也可以使用LLONG_MINorLLONG_MIN或什至LONG_MIN. 您需要检查errno以了解转换是否strtol有效。

如果你使用过std::stol,你最终会得到一个std::out_of_range例外。是否要使用异常取决于您,但同时,使用std::strtoullfor unsigned long long(和 check errno)或 use std::stoull(并记住可能的异常)。

有关更多信息,请参阅[string.conversions]C++ 标准或上面的 cppreference.com 链接。


推荐阅读