■101825 / inTopicNo.1) |
VS2008 での atof関数について |
□投稿者/ パンの耳 (5回)-(2023/04/27(Thu) 01:14:00)
|
分類:[C/C++]
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 の以前のバージョンでサポートされており、コードの互換性に影響する変更点がある可能性があります。
とありました。(https://learn.microsoft.com/ja-jp/cpp/c-runtime-library/reference/atof-atof-l-wtof-wtof-l?view=msvc-170)
つまり、以前のバージョン(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と同様の動作でした)
環境も環境ですし、難しいとは思いますがもし分かる方いらっしゃいましたら、教えてください。
動作環境はWin10 上記はコンソールアプリケーションで作成しています。
よろしくお願いします
|
|