第二个参数(char ** endptr)似乎浪费了空间!如果 它设置为NULL,STRTOL似乎一直沿字符串向下移动,直到 它找到一个无效字符,然后停止。读取的所有有效字符都是 如果字符串以无效字符开头,则将其转换为 函数返回零(0)。
这意味着以下代码应将2
检测为十六进制数字:
int main()
{
char * string = "p1pp2ppp";
unsigned integer = strtoul(string, NULL, 16);
printf("%u", integer);
return 0;
}
但是,它返回零。
为什么?
答案 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
,但手指粗胖的像12w4
,strtoul
将返回12
并将endptr参数设置为指向{{1} }。
基本上,如果字符w
指向的不是空格或endptr
,则输入很可能会被拒绝。