• ベストアンサー

atoi を自作するには

atoi という関数がありますが、これを自作しているページがあれば教えてください。もしくは、直接回答でも構いません。自分で書いているんですが、どうもポインタで失敗しているようなので、参考になるようなソースがあれば御紹介ください。

質問者が選んだベストアンサー

  • ベストアンサー
  • asuca
  • ベストアンサー率47% (11786/24626)
回答No.1

こんなページがあります。 「次頁」に回答例がありソースがあります。

参考URL:
http://www.sgnet.co.jp/c/9-1.htm
hikou
質問者

お礼

ありがとうございました。 そのままコピーしてつかえましたので、大変参考になりました。

その他の回答 (4)

  • bikkuri
  • ベストアンサー率33% (23/68)
回答No.5

自作している理由が「atoiではエラーが取得できない」であれば、 strtolを使うのが簡単です。

hikou
質問者

お礼

ありがとうございます。 エラーの問題ではありませんが・・・strtol についても 調べてみたいと思います。初耳です。

  • ret
  • ベストアンサー率40% (8/20)
回答No.4

自作で作りましたが、こんなのでいいですか? int _atoi(const char* buf) { int i, ans, ret; if(*buf == '-') ans = -1; else ans = 1; i = ret = 0; while(1){ if( (48 <= *(buf + i)) && (*(buf + i) <= 57) ){ ret *= 10; ret += (*(buf + i) - 48); } else if(*(buf + i) == '\0') break; i++; } return ans * ret; }

hikou
質問者

お礼

ありがとうございました。 同じ関数書くのでも、ひとそれぞれ、やっぱり違うんだな ーと感じました。 基本となる処理は同じようですので、その部分を参考にさせていいただきます。

noname#30727
noname#30727
回答No.3

直接回答でもいいということなので。 #include <ctype.h> int myatoi(const char *p) { int n = 0; int s = 1; /* ホワイトスペースをスキップ */ while (isspace(*p)) { p++; } /* 符号の取得 */ if (*p == '-') { s = -1; p++; } else if (*p == '+') { p++; } /* 数値の取得 */ while (isdigit(*p)) { n = n * 10 + *p - '0'; p++; } /* 結果を返す */ return n * s; }

hikou
質問者

お礼

ありがとうございます。わざわざソースを書いていただきまして、感謝で痛み入ります。

  • nightowl
  • ベストアンサー率44% (490/1101)
回答No.2

こんばんは。紹介しようとしたページは asuca さんに先を越されてしまいましたが、 元ネタはそのページにあるようにC言語の父、カーニハンとリッチーの 「プログラミング言語C(第2版)」(石田晴久訳、共立出版)に書かれています。 この本は著者2名(Kernighan, Ritchie)の頭文字を取って「K&R」と呼ばれる古典作で、 自作版の atoi() の限界も記述されていますので、ぜひ読んでみて下さい。 http://www.chienowa.co.jp/frame1/ijinden2/Brian_Kernighan.html

参考URL:
http://www.amazon.co.jp/exec/obidos/ASIN/4320026926/250-8600902-9060234
hikou
質問者

お礼

良書を御紹介いただきまして、ありがとうございます。 明日にでも書店で探してみたいとおもいます。

関連するQ&A