为什么在函数strtod()中使用(char ** endptr)代替(char ch)或(char * chptr)

时间:2012-11-28 01:53:03

标签: c string pointers

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

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

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

感谢。

2 个答案:

答案 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);
}