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 == 0tmp == "blablabla" ,则输入数据的格式不正确。 如果输入数据不是预期的格式,则不需要通过实现设置errno

关于strtolstrtollstrtoulstrtoull函数C说:

(C99,7.20.1.4p7)如果主题序列为空或没有预期的forms,则不进行转换; 如果endptr不是空指针,则nptr的值存储在endptr指向的对象中。

(C99,7.20.1.4p9)strtol,strtoll,strtoul和strtoull函数返回转换后的值(如果有)。 如果无法执行转换,则返回零。