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

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

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

Re[2]: VS2008 での atof関数について


(過去ログ 177 を表示中)

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

■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 上記はコンソールアプリケーションで作成しています。

よろしくお願いします

引用返信 編集キー/
■101828 / inTopicNo.2)  Re[1]: VS2008 での atof関数について
□投稿者/ furu (206回)-(2023/04/27(Thu) 10:18:18)
No101825 (パンの耳 さん) に返信
> 出来ればコンパイルオプションの変更や、関数を置き換えるだけで対応出来るのが理想ですが、
関数置き換えていいのであれば
ラッパー関数作るだけでいいような気がしますが
駄目でしょうか?
引用返信 編集キー/
■101829 / inTopicNo.3)  Re[2]: VS2008 での atof関数について
□投稿者/ パンの耳 (7回)-(2023/04/27(Thu) 12:37:24)
No101828 (furu さん) に返信
回答有難うございます。
たしかにそうですね、、、
atof関数使用前に毎回本文の処理を入れる発想しかありませんでした…
ラッパー関数作るようにします!
有難うございました。
解決済み
引用返信 編集キー/


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

このトピックに書きこむ

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

管理者用

- Child Tree -