0

double strtod(const char *str, char **endptr);

参数endptr是指向指针的指针。停止扫描的字符的地址存储在 endptr 指向的指针中。

为什么要在函数 strtod() 中使用 (char **endptr) 而不是 (char ch) 或 (char *chptr)。

谢谢。

4

2 回答 2

4

为什么要在函数中使用(char **endptr)而不是(char ch)(char *chptr)strtod()

因为该参数旨在向调用者提供信息。所以它必须修改调用者控制的内存,这通常也是最容易通过在调用者中传递变量的地址来完成的。

可以有一个类型的参数char*指向char调用者中的单个变量,但这不允许轻松检查是否应该接受结果(例如,是否要忽略尾随空格)或是否进一步处理需要输入字符串。

拥有该类型char**可以strtoX非常舒适地在解析器中使用,它们在消耗完它们的部分后留下指向字符串其余部分的指针。

如果类型是char*,并且仅保存消耗char的部分之后strtoX,则需要通过本质上重新解析数字来定位进一步解析的点。

于 2012-11-28T01:55:46.607 回答
1

因为使用 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);
}
于 2012-11-28T02:01:15.560 回答