根据this document,
第二个参数(char ** endptr)似乎浪费了空间!如果
它设置为NULL,STRTOL似乎一直沿字符串向下移动,直到
它找到一个无效字符,然后停止。读取的所有有效字符都是
如果字符串以无效字符开头,则将其转换为
函数返回零(0)。
这意味着以下代码应将2
检测为十六进制数字:
int main()
{
char * string = "p1pp2ppp";
unsigned integer = strtoul(string, NULL, 16);
printf("%u", integer);
return 0;
}
但是,它返回零。
为什么?
最佳答案
手册页对第二个参数说了以下内容:
如果endptr不为NULL,则strtol()存储第一个的地址
* endptr中的无效字符。如果根本没有数字,
strtol()将nptr的原始值存储在* endptr中(和
返回0)。特别是,如果* nptr不是'\ 0'但** endptr是
返回“ \ 0”时,整个字符串有效。
例如:
char str[] = "123xyz45";
char *p;
long x = strtol(str, &p, 10);
printf("x=%ld\n", x);
printf("p - str = %d\n", p - str);
printf("*p = %c\n", *p);
printf("p (as string) = %s\n", p);
输出:
x=123
p - str = 3
*p = x
p (as string) = xyz45
我们可以看到,当
strtol
返回p
时,它指向str
中无法转换的第一个字符。可以一次解析字符串,也可以查看整个字符串是否可以转换,或者是否有一些额外的字符。在您的示例中,
string
中的第一个字符(即“ p”)不是以10为基数的数字,因此没有任何转换,该函数返回0。