evilknight 发表于 2009-7-29 21:16:09

[原创]atoi

/******************************************************************************
* 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 ;
    int   nBase ;
    while (scanf ("%s%d", szStr, &nBase) > 0 && nBase != 0 && szStr != '0')
    {
      printf("%d\r\n", my_atoi(szStr, nBase)) ;
    }
    return 0 ;
}

[ 本帖最后由 evilknight 于 2009-7-29 21:35 编辑 ]

pyq 发表于 2009-7-29 21:19:32

很强大,比我的简单多了,牛人就是不同啊

pyq 发表于 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)
{

    intnMark = 0;
    intnSum = 0;
    intj;

    intnCount = 1;
    int array;

    while(*str != '\0' && *str != ' ' && !(*str >= 'a' && *str <= 'z') && !(*str >= 'A' && *str <= 'Z'))
    {   
      
      for(; i < nNum;)
      {
            array = *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*nCount;
         nCount = nCount / 10;
      
    }


    return nSum;
}

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

    return 0;
}

boy 发表于 2009-7-29 22:16:24

/*
        功能:传入一个字符串,返回与之对应的int值
        例如:传入"123",返回0x123
        参数:C风格字符串
        返回值:十六进制的整形
*/
int atoi_hex(char* p)
{
        int value = 0;
        int i = 0;
        while(1)
        {
                if (p == '\0')
                {
                        break;
                }
                switch(p)
                {
                        case '1':
                        case '2':
                        case '3':
                        case '4':
                        case '5':
                        case '6':
                        case '7':
                        case '8':
                        case '9':
                                value += (p - 0x30)
                                break;
                        case 'A':
                        case 'a':
                                value += 10;
                                break;
                        case 'B':
                        case 'b':
                                value += 11;
                                break;
                        case 'C':
                        case 'c':
                                value += 12;
                                break;
                        case 'D':
                        case 'd':
                                value += 13;
                                break;
                        case 'E':
                        case 'e':
                                value += 14;
                                break;
                        case 'F':
                        case 'f':
                                value += 15
                                break;

                }
                value *= 16; //进位
                i++; //p++
        }
        return value / 16;
}懒人的办法
页: [1]
查看完整版本: [原创]atoi