FC2ブログ

スポンサーサイト 

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。
[ --/--/-- --:-- ] スポンサー広告 | トラックバック(-) | コメント(-)

atoi関数の実装 

今回は、文字列を整数に変換する関数「atoi関数」を実装してみたいと思います。

int atoi ( const char *str )
{
   // NULLかチェック
   if(!str)return 0;

   int value = 0;
   const char *p = str;

   // 先頭の文字がマイナスだったら、一文字進める
   if( *p == '-' )p++;

   // *p が 0 から 9 をはみ出したら終了
   while( *p >= '0' && *p <= '9' )
   {
      // valueを10倍
      value *= 10;

      // 文字を正しい整数に直して、一文字進めてvalueに渡す。
      value += *p++ - '0';
   }

   // 先頭がマイナスだったら、value をマイナスにする
   if( *str == '-' )value = -value;

   return value;
}

意外と簡単に実装できました。

※間違いなどがありましたら、報告してもらえるとうれしいです。
スポンサーサイト
無駄を省くコトなのですが・・・・。

While( ) 条件が、0≦(*p)≦9 なので、
if( ) 条件が、0≦(*p)≦9 なのは当然じゃないかと…
試しに、if( *p >= '0' && *p <= '9' )文 抜いてごらん?
条件は、コメントで書けばいいかも。
[ 2009/11/23 13:06 ] [ 編集 ]
↑は間違っています。この人は初心者なので注意しましょう。

プログラムですがstrは破壊禁止のconst char*なので *p -= '0' として破壊してはいけません。破壊しない方法で数値化してください。

模範解答。
#include <string.h>

int atoi(const char* str)
{
 int minus = 0;
 if (*str == '-') {
  minus = -1;
  str++;
 }
 int value = 0;
 static const char* chrtbl = "0123456789";
 const char* pos;
 while(*str && ((pos = strchr(chrtbl, *str++)) != NULL)) {
  value *= 10;
  value += pos - chrtbl;
 }
 return minus ? -value : value;
}
[ 2009/11/23 16:13 ] [ 編集 ]
>通りすがりさん
ご指摘ありがとうございます。
記事修正しておきます。
今度から気をつけます orz
[ 2009/11/23 19:42 ] [ 編集 ]
お初にお目にかかります。DXライブラリPortable製作者の憂煉です。
私も模範解答の一例を作ってみたのでご参考にどうぞ

int atoi ( const char *str )
{
int value = 0;
char minus = 1;

//NULLポインタのチェック
if(!str)return 0;

// 先頭の文字がマイナスだったら、一文字進める。ついでにminusを-1にする。
if( *str == '-' )
{
++str;
minus = -1;
}

// *p が 0 から 9 をはみ出したら終了
while((unsigned char)(*str - '0') <= 9 )
{
//桁が上がったとみなして10倍する
value *= 10;

// 文字を正しい整数に直して、一文字進めてvalueに渡す。
value += *str++ - '0';

}

return value * minus;//minusが-1になっていたら符号が反転する
}

これが一番速い(?)コードなんじゃないかなと思います。
[ 2009/11/23 21:57 ] [ 編集 ]
>憂煉さん
模範解答の例ありがとうございます。
そういえば、通りすがりさんと憂煉さんの例を
見ていたら、先に10倍しとけばif文いりませんね orz
いろいろ修正しておきます。
[ 2009/11/23 22:37 ] [ 編集 ]
↑↑ さすが、憂煉さんだなww

無駄かも知れませんが…。

int atoi(str)
const char *str;
{
  int fugou,number;
  // - 符号?
  if(*str == '-') {
    fugou = (-1);
    str++;
  }
  // + 符号?
  else if(*str == '+') {
    fugou = 1;
    str++;
  }
  // 符号なし(正数)
  else
    fugou = 1;

  number = 0;
  while(('0'<=*str)&&(*str<='9')) {
    number = number*10 + (*str++)-'0';
  }
  return(fugou*number);
}

要するに、くっつけてみたのです。
[ 2009/11/24 20:19 ] [ 編集 ]
コメントの投稿













管理者にだけ表示を許可する


上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。