C言語関係掲示板

過去ログ

No670 atof関数を自作したら・・・

[戻る] [ホームページ]
No.7467

atof関数を自作したら・・・
投稿者---charley(2003/06/17 22:05:50)


atof関数を自作して
double myatof(char *s)
{
	int i;
	double j;
	for(i = 0; s[i] != '\0'; i++){
		if(isdigit(s[i])){
			j = (double)s[i];
			break;
		}
	}
	return j;
}


という関数を作ったらうまくいきませんでした。
理由は j = (double)s[i]; でjに文字コードが代入されてしまい数字が代入されないということと、1桁の数字しか変換できないということは分かったんですがどう直していいのか分かりません。
どなたか教えてください。


No.7469

Re:atof関数を自作したら・・・
投稿者---ともじ(2003/06/17 22:41:47)


こんばんは。

>atof関数を自作して
>という関数を作ったらうまくいきませんでした。

以下、処理の流れです。小数点以上と以下は別々に求めてから加算します。
1. str[i] - '0' で数字が取り出せます。
2. 小数点以上は、既に変換した値を10倍して、新しく取り出した値
  加算します。
3. 小数点以下は、取り出した値を取り出すたびに1/10、1/100、…
  しながら既に変換した値に加算します。
4. 文字列全てを変換したら、2.と3.を加算します。


No.7470

Re:atof関数を自作したら・・・
投稿者---charley(2003/06/17 22:52:58)


レスありがとうございます。早速試してみます。
ところで

>1. str[i] - '0' で数字が取り出せます。
なぜこれで数字が取り出せるんですか?

No.7471

Re:atof関数を自作したら・・・
投稿者---ともじ(2003/06/17 22:59:30)


>>1. str[i] - '0' で数字が取り出せます。
>なぜこれで数字が取り出せるんですか?

ASCIIコードの場合、
  '0':0x30 - '0':0x30 = 0
  '1':0x31 - '0':0x30 = 1
      :          :
  '8':0x38 - '0':0x30 = 8
  '9':0x39 - '0':0x30 = 9
ですね。




No.7472

Re:atof関数を自作したら・・・
投稿者---charley(2003/06/17 23:12:25)


ああ、なるほど。分かりました。
あとは自力で何とかします。
ありがとうございました。

No.7484

Re:atof関数を自作したら・・・
投稿者--- (2003/06/18 10:46:05)


>1. str[i] - '0' で数字が取り出せます。

ASCII コードでしか動作しないですな。
まあ、今時 ASCII コード以外のコード体系を使う処理系を探す方が大変だろうけど、
移植性を考えるといまいちですね。


No.7493

Re:atof関数を自作したら・・・
投稿者---ともじ(2003/06/18 12:09:39)


>>1. str[i] - '0' で数字が取り出せます。
>
>ASCII コードでしか動作しないですな。

EBCDICでも大丈夫ですよ。
  '0':0xf0  '1':0xf1 ... '9':0xf9
ちなみに、K&Rのp28には、
  c - '0'

でその数値が求まる。この式は'0','1',...,'9'が連続して増加してゆく値を
とるときにのみ有効である。幸いこれはどの文字セットにも当てはまる。
とありますね。