strtol指向原始字符串。

10
#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吗?
代码:在线代码

2
使用std::stoull(str)来处理无符号长整型。strtol(以及C++中的std::stol)用于有符号长整型。 - heap underrun
1
注意:使用char代替unsigned char,因为std::string使用的是char - Simon Kraemer
1个回答

12

在您的体系结构上,long 类型的取值范围不包括 9887777655433322200。因此,会将 errno 设置为 ERANGE 并返回 LONG_MAX(与输入相同)。注意,实现还可以使用 LLONG_MINLLONG_MAX 或者 LONG_MIN。要知道使用 strtol 进行转换是否成功,需要检查 errno

如果您使用 std::stol,则最终会抛出一个 std::out_of_range 异常。您是否想要使用异常,这取决于您自己,但同时,您可以使用 std::strtoull 来进行 unsigned long long 类型的转换(并检查 errno),或者使用 std::stoull(并记住可能会抛出异常)。

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


std::from_chars() 也是一个选择。 - Deduplicator

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接