c++ - 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吗?
代码:在线代码
解决方案
9887777655433322200 超出了long
您架构的范围。
这就是为什么errno
设置为ERANGE
并且LONG_MAX
(恰好是您的输入)被返回的原因。请注意,实现也可以使用LLONG_MIN
orLLONG_MIN
或什至LONG_MIN
. 您需要检查errno
以了解转换是否strtol
有效。
如果你使用过std::stol
,你最终会得到一个std::out_of_range
例外。是否要使用异常取决于您,但同时,使用std::strtoull
for unsigned long long
(和 check errno
)或 use std::stoull
(并记住可能的异常)。
有关更多信息,请参阅[string.conversions]
C++ 标准或上面的 cppreference.com 链接。
推荐阅读
- java - 使用选项运行 Maven exec-maven-plugin,包括具有提供范围的依赖项,例如 Intellij
- r - 从 2 个长度不等的列表中获取共同元素
- mongodb - 无法在 Windows 32 位操作系统中安装 MongoDB
- c# - 每个孩子运行一个单独的任务
- wordpress - 将 .php 扩展名添加到 wordpress url
- hyperledger-composer - 如何使用 @returns 注释返回资产或任何变量
- kivy - Kivy 的 ScreenManager:switch_to 似乎不像文档中指定的那样工作
- android - android 中的两次振铃状态指示和无空闲/摘机状态指示
- asp.net-core - IdentityServer4 和 .NET Core Identity 客户端不会在安全标记更改时注销
- c# - 使用 FFMPEG 转换传入的字节数组文件类型 - C# ASP.NET