根据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。

08-19 16:06