こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

締切り済みの質問

strtod

こんにちは
strtodについてです。
double strtod( const char* str, char** str_end );
strtodに途中まで変換できそうで、結局変換できない文字列が渡された場合です。
例えば、
" - "
といった文字列です。
この場合、規格としては*str_endになにが入ることになっているのでしょうか?
こちらのページでは、
https://ja.cppreference.com/w/cpp/string/byte/strtof
「変換が行えない場合は、 ​0​ が返され、 *str_end が str に設定されます。」
という記述があります。
一方、こちらのページでは
https://ja.cppreference.com/w/c/string/byte/strtof
この記述はありません。

とりあえず手元にあるgcc4.6.2の場合は *str_end が str に設定されます。
あちこちページを見てみましたが、記述のあるページとないページが混在している状況で、どうにもはっきりわかりません。
昔はこんな記述はなかったと思いますので、規格のどこかの時点で記述が追加されたのではないかと思うのですが、どなたかお判りになる方はいらっしゃいますでしょうか?

投稿日時 - 2020-02-19 18:14:11

QNo.9714658

困ってます

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(2)

ANo.2

C言語とC++言語の違いでは?

投稿日時 - 2020-02-26 17:21:53

補足

ですので、規格としてはクリアになった感じですね。
なので、とりあえず問題は解決しているのですが、謎なのは、なぜこんなに多くのサイトで記述漏れがあるのかというところです。

投稿日時 - 2020-02-27 11:08:27

お礼

>C言語とC++言語の違いでは?

C89に記述があったようですので、そういうわけではなさそうです。
http://port70.net/~nsz/c/c89/c89-draft.html#4.10.1.4

規格からの伝言ゲームのどこかで欠落が発生した結果でしょうかね。

投稿日時 - 2020-02-27 10:34:43

ANo.1

str_endには変換できなかった文字列が返ります。
**ですのでポインターのポインターですね。

hoge
なら0が返りhogeがstr_endに返ります。(**ですのでhのアドレスが返ります)

投稿日時 - 2020-02-19 19:02:28

補足

それは知っています。
お手持ちの環境で” - "を変換してみてください。

投稿日時 - 2020-02-19 23:15:19

お礼

C89のころからあったようですね。
http://port70.net/~nsz/c/c89/c89-draft.html#4.10.1.4

If the subject sequence is empty or does not have the expected form, no conversion is performed; the value of nptr is stored in the object pointed to by endptr , provided that endptr is not a null pointer.

投稿日時 - 2020-02-25 12:42:15