double strtod(const char *str, char **endptr);
参数 endptr 是指向指针的指针。停止扫描的字符的地址存储在endptr指向的指针中。
为什么在函数strtod()中使用(char ** endptr)而不是(char ch)或(char * chptr)。
感谢。
答案 0 :(得分:4)
为什么在函数
中使用(char **endptr)
(char ch)
代替(char *chptr)
或strtod()
而烦恼
因为该参数旨在向调用者提供信息。因此,它必须修改调用者控制的内存,这通常是通过在调用者中传递变量的地址来实现的。
可以有char*
类型的参数指向调用者中的单个char
变量,但这不允许轻松检查是否应该接受结果(例如,如果尾随空格要被忽略)或者是否需要进一步处理输入字符串的其余部分。
类型char**
允许在解析器中使用strtoX
非常舒服,它们在消耗完它们之后会留下指向字符串其余部分的指针。
如果类型为char*
,并且仅保存了消耗的部分char
之后的strtoX
,则需要通过基本上重新解析数字来定位进一步解析的点。
答案 1 :(得分:1)
因为使用char *
,您只能获得有关停止扫描的字符值的信息,而使用char **
,您可以获得有关字符位置(内存地址)的信息,允许您进一步处理字符串的其余部分。
正如cplusplus.com所示,您可以执行以下操作:
#include <stdio.h>
#include <stdlib.h>
int main()
{
char szOrbits[] = "365.24 29.53";
char *pEnd;
double d1, d2;
d1 = strtod(szOrbits, &pEnd);
d2 = strtod(pEnd, NULL);
printf("The moon completes %.2f orbits per Earth year.\n", d1 / d2);
return (0);
}