LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 1200|回复: 4

实现字符串转换成数字的函数atoi()

[复制链接]
发表于 2005-1-17 12:33:13 | 显示全部楼层 |阅读模式
atoi的函数实现
发表于 2005-1-17 12:54:46 | 显示全部楼层
  1. int atoi(const char *nptr)
  2. {
  3.     return (int) strtol(nptr, (char **)NULL, 10);
  4. }
复制代码

回复 支持 反对

使用道具 举报

发表于 2005-1-17 13:04:45 | 显示全部楼层

  1. #include <stdio.h>

  2. int atoi(const char *num)
  3. {
  4.         static int val[256] = {0};
  5.         if (val['1'] == 0)
  6.         {
  7.                 val['0'] = 0;
  8.                 val['1'] = 1;
  9.                 val['2'] = 2;
  10.                 val['3'] = 3;
  11.                 val['4'] = 4;
  12.                 val['5'] = 5;
  13.                 val['6'] = 6;
  14.                 val['7'] = 7;
  15.                 val['8'] = 8;
  16.                 val['9'] = 9;
  17.         }       
  18.        
  19.         int sum = 0;
  20.         unsigned char *ptr = (unsigned char *)num;
  21.         while (*ptr != 0)
  22.         {
  23.                 if (*ptr < '0' || *ptr > '9')
  24.                         return 0;
  25.                 sum *= 10;
  26.                 sum += val[*ptr++];                
  27.                 if (sum < 0)
  28.                         return 0;
  29.         }
  30.         return sum;
  31. }

  32. int main(int argc, char *argv[])
  33. {
  34.         if (argc != 2)
  35.         {
  36.                 printf("Usage: %s <number>\n", argv[0]);
  37.                 return -1;
  38.         }
  39.         printf("result:%d\n", atoi(argv[1]));
  40.         return 0;
  41. }
复制代码

还不能处理负数。
回复 支持 反对

使用道具 举报

发表于 2005-1-17 13:09:55 | 显示全部楼层
可以处理负数的版本

  1. #include <stdio.h>

  2. int atoi(const char *num)
  3. {

  4.         int minus = 0;
  5.         if (num[0] == 0)
  6.             return 0;
  7.         unsigned char *ptr = (unsigned char *)num;
  8.         if (*ptr == '-')
  9.         {
  10.                 minus = 1;
  11.                 ptr++;
  12.         }
  13.         int sum = 0;
  14.         for (; *ptr != 0; ptr++)
  15.         {
  16.                 if (*ptr < '0' || *ptr > '9')
  17.                         return 0;
  18.                 sum *= 10;
  19.                 sum += (*ptr - '0');                
  20.                 if (sum < 0)
  21.                         return 0;
  22.         }
  23.         if (minus)
  24.                 sum = 0 - sum;
  25.         return sum;
  26. }

  27. int main(int argc, char *argv[])
  28. {
  29.         if (argc != 2)
  30.         {
  31.                 printf("Usage: %s <number>\n", argv[0]);
  32.                 return -1;
  33.         }
  34.         printf("result:%d\n", atoi(argv[1]));
  35.         return 0;
  36. }
复制代码
回复 支持 反对

使用道具 举报

 楼主| 发表于 2005-1-18 14:53:30 | 显示全部楼层
#include <stdio.h>
#include <ctype.h>
int convert(char *str)
{
        int i=0,res=0;
        for(i=0;str != NULL;i++)
        {
         if(! isdigit(str))
         continue;
         else
          {
           res=res * 10 +(str-'0');
          }
        }
           return res;
}
int main(int argc,char *argv[])
{
       if(argc != 2)
       {
       printf("USAGE: %S Number",argv[0]);
       }
       else
       {
       printf("CharNum %s to Number %d",argv[0],convert(argv[1]));
       }
}
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表