C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[1]: Visual Studio 2008 での


(過去ログ 177 を表示中)

[トピック内 2 記事 (1 - 2 表示)]  << 0 >>

■101824 / inTopicNo.1)  Visual Studio 2008 での
  
□投稿者/ パンの耳 (4回)-(2023/04/27(Thu) 01:09:52)

分類:[.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と同様の動作でした)
環境も環境ですし、難しいとは思いますがもし分かる方いらっしゃいましたら、教えてください。

よろしくお願いします

引用返信 編集キー/
■101826 / inTopicNo.2)  Re[1]: Visual Studio 2008 での
□投稿者/ パンの耳 (6回)-(2023/04/27(Thu) 01:14:50)
間違えて投稿しました。
こちらは無視してください。
解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -