atoiアルゴリズム

4689 ワード

enum Status{KValid=0,KInvalid};

int g_nStatus=KValid;

int StrToInt(const char *str)

{

  g_nStatus=KInvalid;

  long num=0;

  if(str!=NULL||*str!='\0')

  {

    bool minus=false;

    if(*str=='+')

       str++;

       else if(*str=='-')

       {

       str++;

       minus=true

     }

       if(*str!='0')

       {

         num=StrToIntCore(str,minus);

       }

  }

  return (int)num;

}



long StrToIntCore(const char*digit,bool minus)

{

  long num=0;

  while(*digit!='\0')

  {

     if(*digit!>='\0'&&*digit<='9')

     {

       int flag=minus?-1:1;

       num=num*10+flag*(*digit-'\0');

       if((!minus**num>0x7FFFFFFF||(minus&&num<(signed int)0x80000000))

       {

         num=0;

         break;

       }

       digit++;

     }

     else

     {

     num=0;

     break;

     }

  }

  if(*digit=='\0')

  {

    g_nStatus=KValid;

  }

  return num;

}