strtol使用errno
我有以下代码:
#include #include #include void main(void) { int data; char * tmp; data = strtol("23ef23",&tmp,10); printf("%d",errno); getchar(); }
输出为0 …
为什么?
我正在使用visual studio 2010 C ++代码必须与C89兼容。
strtol
仅为溢出条件设置errno
,而不是指示解析失败。 为此,您必须检查结束指针的值,但是您需要存储指向原始字符串的指针:
char const * const str = "blah"; char const * endptr; int n = strtol(str, &endptr, 0); if (endptr == str) { /* no conversion was performed */ } else if (*endptr == '\0') { /* the entire string was converted */ } else { /* the unconverted rest of the string starts at endptr */ }
我认为唯一需要的错误值是下溢和溢出。
相反,如果在转换过程中消耗了整个字符串,则表示*endptr = '\0'
,这可能是您可能需要检查的其他内容。
在调用strtol
之前,必须将errno
为0。 否则你会覆盖strtol
设置errno
值。
你的逻辑不符合’规范’。 看到这个无效值不一定设置’errno’。
(复制如下)
long int strtol(const char * str,char ** endptr,int base);
将字符串转换为长整数解析C字符串str将其内容解释为指定基数的整数,该基数作为long int值返回。
该函数首先丢弃所需数量的空白字符,直到找到第一个非空白字符。 然后,从该字符开始,根据依赖于base参数的语法,获取尽可能多的有效字符,并将它们解释为数值。 最后,指向str中整数表示后面的第一个字符的指针存储在endptr指向的对象中。
如果base的值为零,则预期的语法类似于整数常量的语法,整数常量由以下连续形成:
可选的加号或减号可选的前缀表示八进制或hex的基数(分别为“0”或“0x”)
十进制数字序列(如果未指定基本前缀)或八进制或
如果存在特定前缀,则为hex数字
如果基值在2到36之间,则整数的预期格式是表示指定基数整数所需的有效数字和/或字母的连续(从’0’开始直到’z’/’ Z’代表基数36)。 序列可以可选地在加号或减号之前,并且如果base是16,则可选地为“0x”或“0X”前缀。
如果str中的第一个非空白字符序列不是如上定义的有效整数,或者如果由于str为空或者仅包含空格字符而不存在这样的序列,则不执行转换。
参数
str C字符串,包含整数表示。 endptr对char *类型的对象的引用,其值由函数设置为数值后的str中的下一个字符。 此参数也可以是空指针,在这种情况下不使用它。
回报价值
成功时,该函数将转换后的整数作为long int值返回。 如果无法执行有效转换,则返回零值。 如果正确的值超出可表示值的范围,则返回LONG_MAX或LONG_MIN,并将全局变量errno设置为ERANGE。
你必须检查tmp
与"blablabla"
指针不一样。
如果data == 0
且tmp == "blablabla"
,则输入数据的格式不正确。 如果输入数据不是预期的格式,则不需要通过实现设置errno
。
关于strtol
, strtoll
, strtoul
和strtoull
函数C说:
(C99,7.20.1.4p7)如果主题序列为空或没有预期的forms,则不进行转换; 如果endptr不是空指针,则nptr的值存储在endptr指向的对象中。
(C99,7.20.1.4p9)strtol,strtoll,strtoul和strtoull函数返回转换后的值(如果有)。 如果无法执行转换,则返回零。