- ベストアンサー
atoi を自作するには
atoi という関数がありますが、これを自作しているページがあれば教えてください。もしくは、直接回答でも構いません。自分で書いているんですが、どうもポインタで失敗しているようなので、参考になるようなソースがあれば御紹介ください。
- みんなの回答 (5)
- 専門家の回答
質問者が選んだベストアンサー
こんなページがあります。 「次頁」に回答例がありソースがあります。
その他の回答 (4)
- bikkuri
- ベストアンサー率33% (23/68)
自作している理由が「atoiではエラーが取得できない」であれば、 strtolを使うのが簡単です。
お礼
ありがとうございます。 エラーの問題ではありませんが・・・strtol についても 調べてみたいと思います。初耳です。
- ret
- ベストアンサー率40% (8/20)
自作で作りましたが、こんなのでいいですか? 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; }
お礼
ありがとうございました。 同じ関数書くのでも、ひとそれぞれ、やっぱり違うんだな ーと感じました。 基本となる処理は同じようですので、その部分を参考にさせていいただきます。
直接回答でもいいということなので。 #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; }
お礼
ありがとうございます。わざわざソースを書いていただきまして、感謝で痛み入ります。
- nightowl
- ベストアンサー率44% (490/1101)
こんばんは。紹介しようとしたページは asuca さんに先を越されてしまいましたが、 元ネタはそのページにあるようにC言語の父、カーニハンとリッチーの 「プログラミング言語C(第2版)」(石田晴久訳、共立出版)に書かれています。 この本は著者2名(Kernighan, Ritchie)の頭文字を取って「K&R」と呼ばれる古典作で、 自作版の atoi() の限界も記述されていますので、ぜひ読んでみて下さい。 http://www.chienowa.co.jp/frame1/ijinden2/Brian_Kernighan.html
お礼
良書を御紹介いただきまして、ありがとうございます。 明日にでも書店で探してみたいとおもいます。
お礼
ありがとうございました。 そのままコピーしてつかえましたので、大変参考になりました。