#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);
}
Run Code Online (Sandbox Code Playgroud)
sorted string:9887777655433322200
value :9223372036854775807
Run Code Online (Sandbox Code Playgroud)
为什么sorted string:和value:不同?这好像是value:即使在排序之后也以某种方式获取了原始字符串。错误在哪里?是UB吗?
代码:在线代码
Zet*_*eta 11
9887777655433322200long在您的架构上超出范围。
这就是为什么errno会返回设置为ERANGE和LONG_MAX(恰好是您的输入)的原因。需要注意的是一个实现也可以使用LLONG_MIN或者LLONG_MIN甚至LONG_MIN。您需要检查errno以了解转换是否strtol有效。
如果你使用过,std::stol你最终会得到一个std::out_of_range异常。是否要使用异常取决于您,但同时,使用std::strtoullfor unsigned long long(和 check errno)或使用std::stoull(并记住可能的异常)。
有关[string.conversions]更多信息,请参阅C++ 标准或上面指向 cppreference.com 的链接。