3

MSDN によると:

  • strtod変換を実行できない場合、またはアンダーフローが発生した場合は 0 を返します。

文字列がゼロ (つまり 0.0000) の場合はどうなりますか? 変換にエラーがないことを確認するにはどうすればよいですか?

OK、次のコードを使用してアイデアを検証します。

char    *Y = "XYZ";
double  MyNum;
char    *MyEndPtr;
int     Err_Conversion = 0;

errno = 0;  //reset
MyNum = strtod (Y, &MyEndPtr);

if ( (MyNum == 0) && (errno != 0) && (strcmp(Y, MyEndPtr) == 0) )
        { Err_Conversion = 1;   }

MyNum = 0 であることがわかりますが、Y の内容が MyEnPtr にコピーされたり、この強制エラーで errno = 0 になったりすることはありません。何か案が?

4

2 に答える 2

3

str_end関数のパラメーターを使用します。例えば:

const char* str = "123junk";
char* str_end;
double d = strtod(str, &str_end);
// Here:
//   d will be 123
//   str_end will point to (str + 3) (the 'j')

// You can tell the string has some junk data if *str_end != '\0'
if (*str_end != '\0') {
    printf("Found bad data '%s' at end of string\n", str_end);
}

変換が完全に失敗した場合、次のようにstrなりますstr_end:

const char* str = "junk";
char* str_end;
double d = strtod(str, &str_end);
// Here:
//   d will be 0 (conversion failed)
//   str_end will equal str

if (str == str_end) {
    printf("The string doesn't start with a number!\n");
}

これら 2 つの方法を組み合わせて、文字列が (完全に) 正常に変換されたことを確認できます (つまり、 をチェックすることによってstr != str_end && *str_end == '\0') 。

于 2015-01-15T22:06:39.617 に答える
2

署名は次のとおりです(restrictキーワードを与えるか取る):

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

2 番目の引数として null 以外のポインターを渡すと、nptr変換を実行できなかった場合の値が返されます。入力文字列に真のゼロが見つかった場合、に格納される値*endptrnptr.

char *end;
const char *data = "0.00000";

errno = 0;
double d = strtod(data, &end);
if (end != data)
    ...a conversion was performed...
else
    ...trouble...

も参照できますerrnoが、標準 C ライブラリまたは POSIX ライブラリの関数はゼロに設定errnoされないため、呼び出しの前にゼロにする必要があります。

標準は次のように述べています。

サブジェクト シーケンスが空であるか、期待される形式を持たない場合、変換は実行されません。の値は、nptrが指すオブジェクトに格納されます。endptrただし、endptrはヌル ポインタではありません。

戻り値

関数は、変換された値があればそれを返します。変換を実行できなかった場合は、0 が返されます。正しい値がオーバーフローし、デフォルトの丸めが有効な場合 (7.12.1)、プラスまたはマイナスの HUGE_VAL、HUGE_VALF、または HUGE_VALL が返され (戻り値の型と値の符号に従って)、マクロ ERANGE の値が格納されます。でerrno。結果がアンダーフローした場合 (7.12.1)、関数は、戻り値の型で正規化された最小の正の数値以下の大きさの値を返します。errno値 ERANGE を取得するかどうかは実装定義です。

于 2015-01-15T22:05:20.517 に答える