我听说我应该使用strtol而不是atoi因为它更好的错误处理。我想通过查看是否可以使用此代码来检查字符串是否为整数来测试strtol:#include#includeusingnamespacestd;intmain(){stringtestString="ANYTHING";cout0){cout我用5替换了ANYTHING并且它完美地工作:testString=5errno=0Success.testInt=5当我使用2147483648时,最大可能的int+1(2147483648),它返回这个:testString=2147483648errno=34Therewasaner
以下代码在g++4.1.1和-Wall中不会给出警告。intoctalStrToInt(conststd::string&s){returnstrtol(s.c_str(),0,8);}我原以为会收到警告,因为strtol返回一个longint,但我的函数只返回一个普通的int。其他编译器可能会在这里发出警告吗?在这种情况下,我是否应该将返回值转换为int作为一种好的做法? 最佳答案 最好的方法是:longx=strtol(...);assert(x你需要limits.h和assert.h
我知道如何将字符串转换为int、float...从来都不是一个新问题。在浏览了一些文章后,建议我使用strtol、strtoll、strtod,因此我仔细研究了这些函数。虽然strtol在其manpage中声称是线程安全的,但是它会修改errno,那么它真的是线程安全的吗?如果不是,在C++(而非C++11)中执行此类转换作业并保持线程安全的正确方法是什么? 最佳答案 来自errnomanpage:errnoisdefinedbytheISOCstandardtobeamodifiablelvalueoftypeint,andmus
免责声明:链接指向cppreference.com所以我早就知道std::atoi已被弃用,建议使用std::strtol反而。C++11引入了std::stoi我试图理解为什么人们会选择使用它而不是std::strtol。据我了解,stoi调用strtol但抛出异常。它还返回一个整数而不是一个长整数。这些是主要区别吗,我错过了什么? 最佳答案 Arethesethemaindifferences,whatamImissing?较新的std::stoi也可以直接从std::string运行(因此您不必在代码中乱加.c_str()调用
我一直在使用cstdlib中的std::atoll通过gcc将字符串转换为int64_t。该功能似乎在Windows工具链上不可用(使用VisualStudioExpress2010)。什么是最佳选择?我也对将strings转换为uint64_t感兴趣。取自cstdint的整数定义。 最佳答案 MSVC有_atoi64和类似的功能,参见here对于无符号64位类型,请参阅_strtoui64 关于c++-std::atoll与VC++,我们在StackOverflow上找到一个类似的问题
我正在尝试将一些字符转换为数字类型,但其中一些可能不是以null结尾的字符串。那么strtol、strtoll和strtod对于那些不是以null结尾的字符串安全吗? 最佳答案 没有。如果字符数组不是以空字符结尾,则它不是字符串。如果向任何strto*()函数传递了一个不指向字符串的参数,则行为未定义。引用latestdraft2011ISOC标准:7.1.1Definitionofterms:Astringisacontiguoussequenceofcharactersterminatedbyandincludingthefir
我正在尝试将一些字符转换为数字类型,但其中一些可能不是以null结尾的字符串。那么strtol、strtoll和strtod对于那些不是以null结尾的字符串安全吗? 最佳答案 没有。如果字符数组不是以空字符结尾,则它不是字符串。如果向任何strto*()函数传递了一个不指向字符串的参数,则行为未定义。引用latestdraft2011ISOC标准:7.1.1Definitionofterms:Astringisacontiguoussequenceofcharactersterminatedbyandincludingthefir
即使字符串转换成功,测试errno返回一个指示错误的值:#include#includeconstchar*numberString="7";char*endPtr;errno=0;longnumber=strtol(numberString,&endPtr,10);NSLog(@"%ld",number);if(errno){perror("stringtointegerconversionfailed");}输出是(在模拟器上,iOS7)$2014-05-2209:27:32.954Test[2144:60b]7$stringtointegerconversionfailed:No
std::strtol的签名公式如下:longstrtol(constchar*str,char**str_end,intbase);我实际上希望第二个参数是constchar**类型。关于为什么它是char**类型的任何解释?请注意,可以修改constchar**类型的变量。您不能修改的是char*const*变量。 最佳答案 在过去(C90之前)C没有const的概念,一切都使用普通的char*。由于char*可以隐式转换为charconst*更改大多数库函数的签名以支持const不太好很大的问题。char**但是不能转换为ch
我有一个通过getline()获得的字符串(更准确地说,我使用循环和getline逐行读取文件)假设该行是12|34|然后我使用strtok()通过substr=strtok(line,"|");将其缩减并将它们存储到一个带有循环的字符串数组中,part[index]=substr;所以这里的part[0]应该是“12”,part[0]是“34”我想使用strtol,但我已经检查过它不能用于字符串文字,然后我尝试使用以下代码。char*temp=strdup(part[1]);char**ptr;longret=strtol(temp,ptr,10);printf("%x\n",ret