|
分類:[.NET 全般]
Visual Studio 2008 で atof関数を使った時の動作についての質問です。 とっくにサポートの切れているクソ古い環境で申し訳ありません。
以下のコードですが、 #include <stdio.h> #include <stdlib.h>
int main(void) { char str[] = { "100.0d3" };
double val = atof(str); printf("%f", val);
return 0; }
上記を、Visual Studio 2019 で実行すると、 100.000000 が出力されます。 ただし、Visual Studio 2008 で実行すると、 10000.00000 が出力されます。
atof関数のリファレンスを見てみると >>これらの関数の UCRT バージョンでは、Fortran スタイル (d または D) 指数の文字の変換をサポートしていません。 >>この非標準の拡張機能は、CRT の以前のバージョンでサポートされており、コードの互換性に影響する変更点がある可能性があります。 とありました。
つまり、以前のバージョン(2008)では、このFortran スタイルとやらがサポートされているため、 dがあった時点で指数表記?のd(あまり理解できていませんが…)となり、100倍されたと理解しています。
結果としてお聞きしたいのは、Visual Studio 2008 で、2019と同じ動作をして欲しいのですが、 (数値部分のみを変換してほしい) 何かいい方法はないでしょうか?
以下の様、atof関数を使う前に文字の前に\0を入れれば可能ですが、もう少しスマートに出来る方法が無いかなと思いまして… char temp[256]; strcpy_s(temp, sizeof(temp), str); for(int i = 0; i < _countof(str); i++) { if(!(temp[i] >= '0' && temp[i] <= '9' || temp[i] == '.')) { temp[i] = '\0'; break; } }
出来ればコンパイルオプションの変更や、関数を置き換えるだけで対応出来るのが理想ですが、 恐らく難しいと思っています。 (ちなみにstrtod関数もatofと同様の動作でした) 環境も環境ですし、難しいとは思いますがもし分かる方いらっしゃいましたら、教えてください。
よろしくお願いします
|