【问题标题】:strtol is pointing to original stringstrtol 指向原始字符串
【发布时间】:2021-09-05 22:12: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吗?

代码:Online code

【问题讨论】:

  • 使用 std::stoull(str) 代替 unsigned long long。 strtol(和 C++ 中的 std::stol)用于 signed longs。
  • OT:使用char 而不是unsigned char,因为std::string 使用char

标签: c++ strtol


【解决方案1】:

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

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

如果您使用std::stol,您最终会得到std::out_of_range 异常。是否要使用异常取决于您,但同时,使用std::strtoull 代替unsigned long long(并检查errno)或使用std::stoull(并记住可能的异常)。

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

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-03-31
  • 1970-01-01
  • 2019-11-02
  • 1970-01-01
相关资源
最近更新 更多