飘云阁

 找回密码
 加入我们

QQ登录

只需一步,快速开始

查看: 2633|回复: 3

[C/C++] [原创]atoi

[复制链接]
  • TA的每日心情
    开心
    2022-11-16 14:28
  • 签到天数: 5 天

    [LV.2]偶尔看看I

    发表于 2009-7-29 21:16:09 | 显示全部楼层 |阅读模式
    /******************************************************************************
    * Copyright (c) 2009, 黄奇 ,All right reserved.
    *
    * 文 件 名: atoi.c
    *
    * 功能描述: 字符串转成整型,支持36进制(十个数字加26个英文字母)
    *
    * 创 建 人: 黄奇,  2009年 7月29日
    *
    * 创建日期: 2009.7.29
    *
    * 版 本 号: 1.0
    *
    * 修改记录:
    *
    * 编绎环境:Windows XP SP2、 VC 6.0 sp6
    *
    *******************************************************************************/

    #include <stdio.h>
    #include <ctype.h>
    #include <stdlib.h>
    #include <math.h>

    // 待转换字符串,nBase基数
    int my_atoi(char *szStr, int nBase)
    {
        int     num ,
                result;

        num = result = 0 ;

            if (nBase < 0 || nBase > 36)
            {
            // stderr: 标准错误输出
                    fprintf(stderr, "Base error!\r\n") ;
                    return 0 ;
            }

        // 判断字符串是否结束且是否合法
        while (0 != *szStr && isalnum(*szStr))
        {
            // isalnum: 判断字符是不是数字或英文字母
            if (isalnum(*szStr))
            {
                // islower: 判断是不是小写字母
                if (islower(*szStr))
                {
                      result = result * nBase + (*szStr - 'a' + 10) ;
                }
                // isupper: 判断是不是大写字母
                else if (isupper(*szStr))
                {
                      result = result * nBase + (*szStr - 'A' + 10) ;
                }
                else
                {
                      result = result * nBase + (*szStr - '0') ;
                }
            }
            ++szStr ;
        }
       
        return result ;
    }

    int main(void)
    {
        char szStr[20] ;
        int     nBase ;
        while (scanf ("%s%d", szStr, &nBase) > 0 && nBase != 0 && szStr[0] != '0')
        {
            printf("%d\r\n", my_atoi(szStr, nBase)) ;
        }
        return 0 ;
    }

    [ 本帖最后由 evilknight 于 2009-7-29 21:35 编辑 ]
    PYG19周年生日快乐!

    该用户从未签到

    发表于 2009-7-29 21:19:32 | 显示全部楼层
    很强大,比我的简单多了,牛人就是不同啊
    PYG19周年生日快乐!

    该用户从未签到

    发表于 2009-7-29 21:22:02 | 显示全部楼层
    #include <stdio.h>
    #include <string.h>
    #include <stdlib.h>

    static int i = 0;


    int my_atoi(char *str, int nNum)
    {

        int  nMark = 0;
        int  nSum = 0;
        int  j;

        int  nCount = 1;
        int array[10];

        while(*str != '\0' && *str != ' ' && !(*str >= 'a' && *str <= 'z') && !(*str >= 'A' && *str <= 'Z'))
        {   
            
            for(; i < nNum;)
            {
                array[i] = *str - '0';
                ++nMark;
                i++;
                break;
            }
            str++;
        }
        for( j = 0; j < nMark-1; j++)
        {
            nCount = nCount* 10;
        }
        for(j = 0; j < nMark; j++ )
        {
            nSum = nSum +array[j]*nCount;
               nCount = nCount / 10;
            
        }

      
        return nSum;
    }

    int main()
    {
        char *string = "231faaaa";
        int  nLen = strlen(string);
        printf("%d\r\n", my_atoi(string, nLen));

        return 0;
    }
    PYG19周年生日快乐!

    该用户从未签到

    发表于 2009-7-29 22:16:24 | 显示全部楼层
    1. /*
    2.         功能:传入一个字符串,返回与之对应的int值
    3.         例如:传入"123",返回0x123
    4.         参数:C风格字符串
    5.         返回值:十六进制的整形
    6. */
    7. int atoi_hex(char* p)
    8. {
    9.         int value = 0;
    10.         int i = 0;
    11.         while(1)
    12.         {
    13.                 if (p[i] == '\0')
    14.                 {
    15.                         break;
    16.                 }
    17.                 switch(p[i])
    18.                 {
    19.                         case '1':
    20.                         case '2':
    21.                         case '3':
    22.                         case '4':
    23.                         case '5':
    24.                         case '6':
    25.                         case '7':
    26.                         case '8':
    27.                         case '9':
    28.                                 value += (p[i] - 0x30)
    29.                                 break;
    30.                         case 'A':
    31.                         case 'a':
    32.                                 value += 10;
    33.                                 break;
    34.                         case 'B':
    35.                         case 'b':
    36.                                 value += 11;
    37.                                 break;
    38.                         case 'C':
    39.                         case 'c':
    40.                                 value += 12;
    41.                                 break;
    42.                         case 'D':
    43.                         case 'd':
    44.                                 value += 13;
    45.                                 break;
    46.                         case 'E':
    47.                         case 'e':
    48.                                 value += 14;
    49.                                 break;
    50.                         case 'F':
    51.                         case 'f':
    52.                                 value += 15
    53.                                 break;

    54.                 }
    55.                 value *= 16; //进位
    56.                 i++; //p++
    57.         }
    58.         return value / 16;
    59. }
    复制代码
    懒人的办法
    PYG19周年生日快乐!
    您需要登录后才可以回帖 登录 | 加入我们

    本版积分规则

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