double strtod(const char *str, char **endptr);
引数endptrは、ポインターへのポインターです。スキャンを停止した文字のアドレスは、endptrが指すポインターに格納されます。
関数strtod()で(char ch)または(char * chptr)の代わりに(char ** endptr)を使用するのはなぜですか。
ありがとう。
(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);
}