atol()和strtol()有什么区别?
根据他们的手册页,它们似乎具有相同的效果以及匹配的参数:
long atol(const char *nptr);
long int strtol(const char *nptr, char **endptr, int base);
Run Code Online (Sandbox Code Playgroud)
在一般情况下,当我不想使用base参数(我只有十进制数)时,我应该使用哪个函数?
在C语言中,什么是十六进制数字字符串转换成二进制最有效的方法unsigned int还是unsigned long?
例如,如果我有0xFFFFFFFE,我想要一个intbase10值4294967294.
我一直在使用std::atollfrom cstdlib将字符串转换为int64_t带有gcc 的字符串.该工具似乎在Windows工具链上不可用(使用Visual Studio Express 2010).什么是最好的选择?
我也有兴趣转换strings成uint64_t.整数定义取自cstdint.
我可以做这个:
int main(int argc, char** argv) {
unsigned char cTest = 0xff;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
但是通过命令行将十六进制数字输入程序的正确方法是什么?
unsigned char cTest = argv[1];
没有办法.这产生了一个初始化,从指针生成整数而没有强制转换警告
#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吗?
代码:在线代码
出于专业的好奇心,比较C中两个完全数字字符串的最安全/最快/最有效的方法是什么?
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int main(void){
char str1[5] = "123";
char str2[5] = "123";
char *ptr;
if(atoi(str1) == atoi(str2))
printf("Equal strings");
if(strtol(str1,&ptr,10) == strtol(str2,&ptr,10))
printf("Equal strings");
if(strcmp(str1,str2)==0)
printf("Equal strings");
return 0;
}
Run Code Online (Sandbox Code Playgroud) 考虑以下:
#include <iostream>
#include <cstdint>
int main() {
std::cout << std::hex
<< "0x" << std::strtoull("0xFFFFFFFFFFFFFFFF",0,16) << std::endl
<< "0x" << uint64_t(double(std::strtoull("0xFFFFFFFFFFFFFFFF",0,16))) << std::endl
<< "0x" << uint64_t(double(uint64_t(0xFFFFFFFFFFFFFFFF))) << std::endl;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
哪些打印:
0xffffffffffffffff
0x0
0xffffffffffffffff
Run Code Online (Sandbox Code Playgroud)
第一个数字只是将ULLONG_MAX,从字符串转换为的结果,uint64_t按预期方式运行。
但是,如果我将结果转换为double,然后又转换为uint64_t,则它将输出0第二个数字。
通常,我将其归因于浮点数的精度不准确,但令我感到困惑的是,如果我将ULLONG_MAXfrom转换uint64_t为double,然后再转换回uint64_t,结果是正确的(第三个数字)。
为什么第二和第三结果之间存在差异?
编辑(@Radoslaw Cybulski撰写)有关此处发生的另一个问题,请尝试以下代码:
#include <iostream>
#include <cstdint>
using namespace std;
int main() {
uint64_t z1 = std::strtoull("0xFFFFFFFFFFFFFFFF",0,16);
uint64_t z2 = 0xFFFFFFFFFFFFFFFFull;
std::cout << …Run Code Online (Sandbox Code Playgroud) stoiC ++ 的功能定义为:
int stoi(const std::string& str, std::size_t* pos = 0, int base = 10);
Run Code Online (Sandbox Code Playgroud)
如您所见,该base参数默认为10,因此默认情况下它只能处理十进制数字。通过设置base为0,它可以按数字的前缀处理数字。这与行为相同strtol,因此为什么将默认值设置为10而不是0?
我真的很困惑.我必须遗漏一些相当简单的东西,但我读到的关于strtol()的任何内容都没有意义.有人能以一种非常基本的方式为我拼出它,并举例说明我可能会得到类似下面的东西吗?
string input = getUserInput;
int numberinput = strtol(input,?,?);
Run Code Online (Sandbox Code Playgroud) 我一直在尝试将char数组正确转换为long strtol,检查是否存在溢出或下溢,然后对long进行int转换.一路上,我注意到很多代码看起来像这样
if ((result == LONG_MAX || result == LONG_MIN) && errno == ERANGE)
{
// Handle the error
}
Run Code Online (Sandbox Code Playgroud)
为什么你不能只说
if(errno == ERANGE)
{
// Handle the error
}
Run Code Online (Sandbox Code Playgroud)
根据我的理解,如果发生下溢或溢出,则在两种情况下都将errno设置为ERANGE.前者真的有必要吗?可以单独检查ERANGE是否有问题?
这就是我的代码现在的样子
char *endPtr;
errno = 0;
long result = strtol(str, &endPtr, 10);
if(errno == ERANGE)
{
// Handle Error
}
else if(result > INT_MAX || result < INT_MIN)
{
// Handle Error
}
else if(endPtr == str || *endPtr != '\0')
{
// Handle Error
}
num = …Run Code Online (Sandbox Code Playgroud)