strtol 指向原始字符串
strtol is pointing to original string
#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
9887777655433322200 超出了您的体系结构 long
的范围。
这就是为什么 errno
被设置为 ERANGE
并返回 LONG_MAX
(恰好是您的输入)的原因。请注意,实现也可以使用 LLONG_MIN
或 LLONG_MIN
甚至 LONG_MIN
。您需要检查 errno
以了解 strtol
的转换是否有效。
如果您使用了 std::stol
you would have ended up with an std::out_of_range
exception instead. Whether you want to use exceptions is up to you, but meanwhile, use either std::strtoull
for unsigned long long
(and check errno
) or use std::stoull
(并记住可能的例外情况)。
有关详细信息,请参阅 C++ 标准中的 [string.conversions]
或上面指向 cppreference.com 的链接。
#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
9887777655433322200 超出了您的体系结构 long
的范围。
这就是为什么 errno
被设置为 ERANGE
并返回 LONG_MAX
(恰好是您的输入)的原因。请注意,实现也可以使用 LLONG_MIN
或 LLONG_MIN
甚至 LONG_MIN
。您需要检查 errno
以了解 strtol
的转换是否有效。
如果您使用了 std::stol
you would have ended up with an std::out_of_range
exception instead. Whether you want to use exceptions is up to you, but meanwhile, use either std::strtoull
for unsigned long long
(and check errno
) or use std::stoull
(并记住可能的例外情况)。
有关详细信息,请参阅 C++ 标准中的 [string.conversions]
或上面指向 cppreference.com 的链接。