我有以下代码:
#include <stdlib.h>
#include <stdio.h>
#include <errno.h>
void main(void)
{
int data;
char * tmp;
data = strtol("23ef23",&tmp,10);
printf("%d",errno);
getchar();
}输出为0 ...
为什么?
我使用的是visual Studio2010 C++代码必须与C89兼容。
发布于 2012-02-25 23:15:50
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',这可能是您想要检查的另外一件事。
发布于 2012-02-25 23:16:31
您的逻辑与“规范”不符。请参见this无效的值不一定要设置'errno‘。
(副本如下)
long int strtol ( const char * str,char ** endptr,int base );
Convert string to long integer解析C字符串字符串,将其内容解释为指定基数的整数,并将其作为长整数值返回。
该函数首先根据需要丢弃尽可能多的空格字符,直到找到第一个非空格字符。然后,从这个字符开始,按照依赖于base参数的语法,获取尽可能多的有效字符,并将它们解释为数值。最后,指向str中整数表示形式后面的第一个字符的指针存储在endptr指向的对象中。
如果base的值为零,则预期的语法类似于整数常量的语法,整数常量由以下一系列组成:
一个可选的加号或减号可选的前缀,表示八进制或十六进制的基数(分别为“0”或"0x“)
十进制数字序列(如果未指定基前缀)或八进制或
如果存在特定前缀,则为十六进制数字
如果基值介于2和36之间,则整数所需的格式是表示指定基数的整数所需的一系列有效数字和/或字母(从'0‘开始,直到'z'/'Z’表示基数36)。可选地,该序列前面可以有一个加号或减号,如果base是16,则前面可以有一个可选的"0x“或"0X”前缀。
如果str中的第一个非空格字符序列不是上面定义的有效整数,或者如果由于str为空或它只包含空格字符而不存在这样的序列,则不执行转换。
参数
字符串C包含整数表示形式的字符串。endptr引用char*类型的对象,其值由函数设置为str中数值后的下一个字符。此参数也可以是空指针,在这种情况下不使用它。
返回值
如果成功,该函数将转换后的整数作为长整数值返回。如果不能执行有效的转换,则返回零值。如果正确的值超出可表示值的范围,则返回LONG_MAX或LONG_MIN,并将全局变量ERANGE设置为ERANGE。
发布于 2012-02-25 23:16:00
在调用strtol之前,必须将errno设置为0。否则,您将覆盖strtol设置为errno的任何值。
https://stackoverflow.com/questions/9445171
复制相似问题