atoi的实现

来源:互联网 发布:sqlserver数据库脱机 编辑:程序博客网 时间:2024/05/22 12:58

int __atoi(const char *nptr)
{
           int cur;
           int sign;
           int total = 0;

           while( isspace((int)(unsigned char)*nptr))
                     ++nptr;

           cur = (int)(unsigned char)*nptr++;
           sign = cur;

           if(cur == '-' || cur == '+')
                     cur = (int)(unsigned char)*nptr++;

           while(isdigit(cur))
           {
                     total = 10 * total + (cur - '0');
                     cur = (int)(unsigned long)*nptr++;
           }

           if(sign == '-')
                     return -total;
           else
                     return total;

}

 

int main()
{

           char *str = "   +1238.3";
           std::cout<< __atoi(str) << std::endl;
 
           system("pause");
           return 0;
}

//注:

           while( isspace((int)(unsigned char)*nptr))
                     ++nptr;

这一段函数让传入的字符串 过滤掉开始的一些制表符使用isspace函数

           cur = (int)(unsigned char)*nptr++;
           sign = cur;

得到字符串中的第一个可用字符 并保存到sign因为他可能是负号 或者 加号

           if(cur == '-' || cur == '+')
                     cur = (int)(unsigned char)*nptr++;

如果cur 是 负号 或者 加号就跳过 我们已近有了备份了 如果不是 那么我们的备份或许用不上了..

while(isdigit(cur))
这里判断了 cur是否是 0 到 9之间的数字 如果不是则跳过

如果是的话 那么我们就将每个数字保存起来并重新计算 通过

total = 10 * total + (cur - '0');


最后拿出我们的备份 看看他是否是负号 如果是的话那么 返回负的total

 

 

 

 

 

 

 

long   __cdecl   atol(
                         const   char   *nptr
                         )
{
                         int   c;                                          /*   current   char   */
                         long   total;                           /*   current   total   */
                         int   sign;                                 /*   if    '- ',   then   negative,   otherwise   positive   */

                         /*   skip   whitespace   */
                         while   (   isspace((int)(unsigned   char)*nptr)   )
                                     ++nptr;

                         c   =   (int)(unsigned   char)*nptr++;
                         sign   =   c;                                 /*   save   sign   indication   */
                         if   (c   ==    '- '   ||   c   ==    '+ ')
                                     c   =   (int)(unsigned   char)*nptr++;            /*   skip   sign   */

                         total   =   0;

                         while   (isdigit(c))   {
                                     total   =   10   *   total   +   (c   -    '0 ');               /*   accumulate   digit   */
                                     c   =   (int)(unsigned   char)*nptr++;            /*   get   next   char   */
                         }

                         if   (sign   ==    '- ')
                                     return   -total;
                         else
                                     return   total;         /*   return   result,   negated   if   necessary   */
}