[原创]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 编辑 ] 很强大,比我的简单多了,牛人就是不同啊 #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;
} /*
功能:传入一个字符串,返回与之对应的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]