标签: strtol

atol()v/s.与strtol()

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 strtol

60
推荐指数
5
解决办法
6万
查看次数

在C中有效地将十六进制字符串转换为整数?

在C语言中,什么是十六进制数字字符串转换成二进制最有效的方法unsigned int还是unsigned long

例如,如果我有0xFFFFFFFE,我想要一个intbase10值4294967294.

c performance hex strtol

23
推荐指数
6
解决办法
20万
查看次数

带VC++的std :: atoll

我一直在使用std::atollfrom cstdlib将字符串转换为int64_t带有gcc 的字符串.该工具似乎在Windows工具链上不可用(使用Visual Studio Express 2010).什么是最好的选择?

我也有兴趣转换stringsuint64_t.整数定义取自cstdint.

c++ int64 uint64 strtol

10
推荐指数
2
解决办法
7910
查看次数

通过命令行将十六进制数字输入程序

我可以做这个:

int main(int argc, char** argv) {
  unsigned char cTest = 0xff;
  return 0;
}
Run Code Online (Sandbox Code Playgroud)

但是通过命令行将十六进制数字输入程序的正确方法是什么?

unsigned char cTest = argv[1];

没有办法.这产生了一个初始化,从指针生成整数而没有强制转换警告

c base-conversion strtol

9
推荐指数
3
解决办法
2万
查看次数

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);
}
Run Code Online (Sandbox Code Playgroud)
sorted string:9887777655433322200
value        :9223372036854775807
Run Code Online (Sandbox Code Playgroud)

为什么sorted string:value:不同?这好像是value:即使在排序之后也以某种方式获取了原始字符串。错误在哪里?是UB吗?

代码:在线代码

c++ strtol

9
推荐指数
1
解决办法
335
查看次数

C - 比较数字字符串

出于专业的好奇心,比较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)

c atoi strcmp strtol

8
推荐指数
1
解决办法
1万
查看次数

当转换为double然后返回uint64_t时,strtoull()的输出会失去精度。

考虑以下:

#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_tdouble,然后再转换回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)

c++ precision strtol strtoull

8
推荐指数
1
解决办法
73
查看次数

std :: stoi的基本参数

stoiC ++ 的功能定义为:

int stoi(const std::string& str, std::size_t* pos = 0, int base = 10);
Run Code Online (Sandbox Code Playgroud)

如您所见,该base参数默认为10,因此默认情况下它只能处理十进制数字。通过设置base0,它可以按数字的前缀处理数字。这与行为相同strtol,因此为什么将默认值设置为10而不是0

c++ string atoi strtol c++11

8
推荐指数
1
解决办法
157
查看次数

strtol的基础知识?

我真的很困惑.我必须遗漏一些相当简单的东西,但我读到的关于strtol()的任何内容都没有意义.有人能以一种非常基本的方式为我拼出它,并举例说明我可能会得到类似下面的东西吗?

string input = getUserInput;
int numberinput = strtol(input,?,?);
Run Code Online (Sandbox Code Playgroud)

c++ string int strtol

7
推荐指数
1
解决办法
3万
查看次数

为什么你不能检查errno是否等于ERANGE?

我一直在尝试将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)

c errno strtol

7
推荐指数
1
解决办法
967
查看次数

标签 统计

strtol ×10

c ×5

c++ ×5

atoi ×2

string ×2

base-conversion ×1

c++11 ×1

errno ×1

hex ×1

int ×1

int64 ×1

performance ×1

precision ×1

strcmp ×1

strtoull ×1

uint64 ×1