strtoul()函数中的第二个参数做什么?

时间:2019-04-08 12:09:55

标签: c hex strtoul

根据this document

  

第二个参数(char ** endptr)似乎浪费了空间!如果   它设置为NULL,STRTOL似乎一直沿字符串向下移动,直到   它找到一个无效字符,然后停止。读取的所有有效字符都是   如果字符串以无效字符开头,则将其转换为   函数返回零(0)。

这意味着以下代码应将2检测为十六进制数字:

int main()
{
    char * string = "p1pp2ppp";

    unsigned integer = strtoul(string, NULL, 16);

    printf("%u", integer);

    return 0;
}

但是,它返回零。

为什么?

3 个答案:

答案 0 :(得分:1)

该手册页针对第二个参数说了以下内容:

  

如果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。

答案 1 :(得分:0)

  

为什么?

返回0是因为"p..."不遵循任何有关整数表示的规则。 第二个参数与您的问题无关。

答案 2 :(得分:0)

所有char **endptr函数中的strto*参数旨在接收第一个字符的地址,该字符不是有效整数(小数,十六进制,或八进制)或浮点数。绝非无用,它可以方便地检查无效输入。例如,如果我打算输入1234,但手指粗胖的像12w4strtoul将返回12并将endptr参数设置为指向{{1} }。

基本上,如果字符w指向的不是空格或endptr,则输入很可能会被拒绝。