• ベストアンサー

atoi を自作するには

nightowlの回答

  • 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

  • atoiについての疑問

    いつもお世話になっております。 またしても、教えていただきたい事がありまして質問させていただきます。 年月を『YYYY/MM/DD』形式で入力するプログラムで、『YYYY/MM/DD』形式以外の形式や暦として不正な値を入力すると、再度入力を促すプログラムを作成しています。 そこで、「strtok関数」を使い"/"で区切った文字列を「atoi関数」で数値にしようと思いました。(この方法で良いかは分からないのですが、他の方法が思い浮かばなかったので…) そこで、以下のようなプログラムを作ってみたのですが、結果を表示すると、なぜか最後の数字が1文字消えてしまいます。 ↓このようなソースを作りました。 【作ったソース】 #include<stdio.h> #include<stdlib.h> #include<string.h> void manth_view(void) { char nengetu[30],*syear; int year,manth; printf("年月を入力して下さい。>>"); fgets(nengetu,sizeof(nengetu),stdin); syear = strtok(nengetu,"/"); year = atoi(syear); printf("入力された年 %d\n",year); manth=atoi(strtok(NULL,"/")); printf("入力された月 %d\n",manth); } 【結果】入力した年月→2007/12  入力された年 200  入力された月 1 上記の結果のように、どのように入力しても、最後の1文字が消えてしまいます。 何故なのか昨日からずっと考えているのですが、分かりません。 どうか教えてください。

  • atoi関数の自作

    C言語でatoi関数を自作したのですが、正確な答えが出てきません 以下にソースを貼るのでどの当たりを直したらよいのかご教授願います。 1~9までの文字列を一つずつ配列に格納して変換する事を目的として作っています。 実行すると桁あふれしたような値が出てきてしまいます #include<stdio.h> #include<stdlib.h> int pow_10(int m) { int i,prod=1; for(i=0;i<m;i++){ prod=prod*10; } return prod; } ascii2int(char number[]){ int i,j,n[10],num; if(!strcmp(number,"")){ printf("Null string\n"); exit(1); } i=0; while(n[i]!='\0'){ n[i]=n[i]-48; i++; } num=0; for(j=0;j<i;j++){ num=num+n[j]*pow_10(i-1-j); } return num; } main(){ char su[10]; for(;;){ printf("Enter an integar:"); gets(su); if(!strcmp("x",su)){ break; } printf("%d\n",ascii2int(su)); } }

  • 自作関数について

    質問なのですが自作関数を作成した際に、その関数ごとに 保存などはするのでしょうか?それとも、通常通り 関数が入っているソースごと保存するのでしょうか? 自分のイメージでは関数のソースをフォルダ等にまとめて 一括管理しているのかと思っているのですが、、、 実際どうななんでしょうか?よろしくお願いします。

  • strncpy後のatoiがおかしい

    こんにちは。 C++をVS2005でやっています。 atoi関数を使っているんですが、10個の配列strにstrncpyをやると値がおかしくなります。 10個目に'\0'を代入させてやってみても駄目でした。 以下にソースを載せます。 #include <string.h> #include <stdlib.h> #include <stdio.h> #include <errno.h> int main( void ) { char string[256]; char str[10]; char *moji = "12345464"; int l; // using template versions of strcpy_s and strcat_s: strcpy(string, "6877897898"); strcat(string, "strcpy_s"); strcat(string, "and"); // of course we can supply the size explicitly if we want to: strcat(string, "strcat_s!"); strncpy(str, string, 10); l = strtol(str,NULL,10);// 値が違う 6877897898にならない printf("str = %d\n", l); l = atoi(moji); printf("moji = %d\n", l); l = atoi(string);// 値が違う printf("string = %d\n", l); printf("String = %s\n", string); getchar(); return 0; } 表示結果 str = 2147483647 moji = 12345464 string = 2147483647 String = 6877897898 mojiは正常に動作しますから、ナル文字が原因なのかと思ってしまいますが。原因がいまいち分かりません。 よろしくお願いします。

  • 自作した関数やクラスの管理方法

    はじめまして、関数やクラスを多数自作をしていくと、関数の場合どんな関数を作ったか忘れてしまったりします、クラスの場合はどのクラスから継承した分からなくなったりします。 そこで自作したソースをきちんと管理したいのですが、どんなアプリを皆様お使いなのか分かりません、お勧めのアプリを教えて下さい。 個人で使用する規模のものでOKです。 グループで開発する事は考えておりません。 ご回答を宜しくお願いします。

  • PCの自作を考えていますが・・・。

    こんにちは。 デスクPCを自作したい、と思っている者です。 自分は現在、自作PCの作り方が書かれている書籍を手に勉強しています。 製品を買うことも検討したのですが、どうしても自作をしてみたいという思いがあり勉強を始めました。 製品を買ったほうが安く済むし安心感はあると思いますが、自作する楽しさも魅力的です。 失敗するのは正直怖いですが、それでも原因を考えて解決する手段も覚えていきたいと思っています。 それに失敗を恐れたら「製品買えば?」ってことになると思うので・・・。 肝心な質問ですが、 自作PCについて、というよりかは、自作経験者についてお伺いしたいのですが、自作を初めてするときにどういったことを参考にされましたか? 例1)ショップの店員からアドバイスをしてもらった 例2)自作PCに関する本を読んだ あと、「自作するならこれは気をつけろ!」ということがあればそれもぜひご教授ください。

  • strtok関数 自作

    strtok関数の内部の処理がしりたいので、自作された事がある方はぜひソースプログラムを教えてください。

  • 自作Assert関数が上手く動作しません...

    開発環境:VisualStudio2013 言語:C++ Assert関数を自作してみようと思いコードを書いてみたのですが、 上手く動作してくれません。。。 お手数をおかけしますが、どなたかご指導お願いできないでしょうか? 現状:  ・char* p=NULL; ←NULLで初期化  ・ASSERT( p ); ←これは、問題なくエラー出力してくれる 問題:  ・char* p; ←初期化しない  ・ASSERT( p ); ←エラー出力してくれない。。。。 というように、ポインタにNULLが入っていないとエラー出力してくれないのです。 ソースコード template<class T> inline void ASSERT(T&p) { if ( !( p ) ) ←p がNULLで初期化していると条件文の中に入ってくれるが、 {        初期化してないと、入ってくれない・・・・ //自作ログ出力関数 OutputLogString(TEXT("Assertion Failure:%s(%d)"), __FILE__, __LINE__); } } void main(void) { char* p; ASSERT(p); } ポインタpが、NULLならもちろん、初期化されていなくてもエラーとして受け取ってくれるには、 何が足りないのでしょうか? お手数をおかけしますが、ご回答よろしくお願いします

  • ホワイトソースは自作しますか?

    こんにちは グラタンなどの料理に使うホワイトソース。 みなさんは自作しますか? 私はよく失敗するので、市販のモノを買ってます(;^_^A

  • パソコンの自作について

    ベアボーンを使って自作しようと思っているのですが、参考になりそうな本やHPを紹介して頂けないでしょうか。 よろしくお願いいたしますm(_ _)m