根据this document ,
The second argument (char **endptr) seems to be a waste of space! If it is set to NULL, STRTOL seems to work its way down the string until it finds an invalid character and then stops. All valid chars read are then converted if the string starts with an invalid character the function returns ZERO (0).
这意味着以下代码应将 2
检测为十六进制数:
int main()
{
char * string = "p1pp2ppp";
unsigned integer = strtoul(string, NULL, 16);
printf("%u", integer);
return 0;
}
但是,它返回零。
为什么?
最佳答案
手册页对第二个参数进行了以下说明:
If endptr is not NULL, strtol() stores the address of the first invalid character in *endptr. If there were no digits at all, strtol() stores the original value of nptr in *endptr (and returns 0). In particular, if *nptr is not '\0' but **endptr is '\0' on return, the entire string is valid.
例如:
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。
关于c - strtoul() 函数中的第二个参数有什么作用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55573174/