如何检测strtol()是否未转换数字?我在下面的简单案例中测试了它,它输出了0.现在明显的问题是如何区分非转换和0转换?检测strtol失败
long int li1;
li1 = strtol("some string with no numbers",NULL,10);
printf("li1: %ld\n",li1);
****
li1: 0
如何检测strtol()是否未转换数字?我在下面的简单案例中测试了它,它输出了0.现在明显的问题是如何区分非转换和0转换?检测strtol失败
long int li1;
li1 = strtol("some string with no numbers",NULL,10);
printf("li1: %ld\n",li1);
****
li1: 0
的strtol
声明中stdio.h
如下:
long int strtol(const char *nptr, char **endptr, int base);
strtol
提供了一个强大的错误检查和验证方案,允许您确定返回值是否为valid
或invalid
。从本质上讲,你有3个主要工具可供您使用。 (1)返回的值,(2)errno
由呼叫设置为值,和(3)的地址和nptr
,并提供给内容endptr
,并且通过,strtol
设置。 (有关完整的详细信息,请参见man 3 strtol
- man
页面中的示例还提供了一组较短的检查条件,但在下面对它们进行了扩展以供解释)。
在你的情况下,你问关于0
返回值并确定它是否有效。如您所见,strtol
返回的0
值而非表示读取的数字为0
或0
有效。要确定0
是否有效,您还必须查看呼叫期间设置的值errno
(如果已设置)。具体而言,如果errno != 0
和strtol
返回的值是0
,则strtol
返回的值是无效。 (该条件将代表invalid base
,underflow
或overflow
,errno
等于EINVAL
或ERANGE
)。
还有第二种情况,可能导致strtol
返回无效0
。 没有数字被读入的情况。发生这种情况时,strtol
将设置值endptr == nptr
。因此,在结束输入0
值之前,还必须检查指针值是否相等。 (一个VALID0
可以与多个0's
字符串中被输入)
以下提供的不同错误条件一个简单的例子来检查评估的strtol
与几种不同的测试条件沿着返回时:
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <limits.h>
int main (int argc, char **argv)
{
if (argc < 2) {
fprintf (stderr, "\n Error: insufficient input. Usage: %s int [int (base)]\n\n", argv[0]);
return 1;
}
const char *nptr = argv[1]; /* string to read */
char *endptr = NULL; /* pointer to additional chars */
int base = (argc > 2) ? atoi (argv[2]) : 10; /* numeric base (default 10) */
long number = 0; /* variable holding return */
/* reset errno to 0 before call */
errno = 0;
/* call to strtol assigning return to number */
number = strtol (nptr, &endptr, base);
/* output original string of characters considered */
printf ("\n string : %s\n base : %d\n endptr : %s\n\n", nptr, base, endptr);
/* test return to number and errno values */
if (nptr == endptr)
printf (" number : %lu invalid (no digits found, 0 returned)\n", number);
else if (errno == ERANGE && number == LONG_MIN)
printf (" number : %lu invalid (underflow occurred)\n", number);
else if (errno == ERANGE && number == LONG_MAX)
printf (" number : %lu invalid (overflow occurred)\n", number);
else if (errno == EINVAL) /* not in all c99 implementations - gcc OK */
printf (" number : %lu invalid (base contains unsupported value)\n", number);
else if (errno != 0 && number == 0)
printf (" number : %lu invalid (unspecified error occurred)\n", number);
else if (errno == 0 && nptr && !*endptr)
printf (" number : %lu valid (and represents all characters read)\n", number);
else if (errno == 0 && nptr && *endptr != 0)
printf (" number : %lu valid (but additional characters remain)\n", number);
printf ("\n");
return 0;
}
输出:
$ ./bin/s2lv 578231
string : 578231
base : 10
endptr :
number : 578231 valid (and represents all characters read)
$ ./bin/s2lv 578231_w_additional_chars
string : 578231_w_additional_chars
base : 10
endptr : _w_additional_chars
number : 578231 valid (but additional characters remain)
$ ./bin/s2lv 578some2more3stuff1
string : 578some2more3stuff1
base : 10
endptr : some2more3stuff1
number : 578 valid (but additional characters remain)
$ ./bin/s2lv 00000000000000000
string : 00000000000000000
base : 10
endptr :
number : 0 valid (and represents all characters read)
$ ./bin/s2lv stuff578231
string : stuff578231
base : 10
endptr : stuff578231
number : 0 invalid (no digits found, 0 returned)
$ ./bin/s2lv 00000000000000000 -2
string : 00000000000000000
base : -2
endptr : (null)
number : 0 invalid (base contains unsupported value)
[C++ - 正确strtol将的用途](HTTP://计算器。 COM /问题/ 14176123 /正确的用法 - 的 - 与strtol) – DOOM 2014-09-28 05:54:25