double strtod(const char *str, char **endptr);
参数endptr是指向指针的指针。停止扫描的字符的地址存储在 endptr 指向的指针中。
为什么要在函数 strtod() 中使用 (char **endptr) 而不是 (char ch) 或 (char *chptr)。
谢谢。
为什么要在函数中使用
(char **endptr)
而不是(char ch)
或(char *chptr)
strtod()
因为该参数旨在向调用者提供信息。所以它必须修改调用者控制的内存,这通常也是最容易通过在调用者中传递变量的地址来完成的。
可以有一个类型的参数char*
指向char
调用者中的单个变量,但这不允许轻松检查是否应该接受结果(例如,是否要忽略尾随空格)或是否进一步处理需要输入字符串。
拥有该类型char**
可以strtoX
非常舒适地在解析器中使用,它们在消耗完它们的部分后留下指向字符串其余部分的指针。
如果类型是char*
,并且仅保存消耗char
的部分之后strtoX
,则需要通过本质上重新解析数字来定位进一步解析的点。
因为使用 achar *
您将只获得有关停止扫描的字符的值的信息,而使用 achar **
您可以获得有关字符位置(内存地址)的信息,这使您可以进一步处理字符串的其余部分。
如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);
}