问题描述:
该题目是对一般的字符串转整型函数的提升。该题目可以扩展对任意进制的字符串,转换成整型值。比如:我们知道以0开头的为八进制,以0x开头的为十六进制。在这里我们还可以规定以其他符号开头的字符串为某进制,比如:规定以“*”开头的为二进制等等。
我们需要做的就是将这些不同进制的字符串,转换成相应的整型值。超出整型值范围的返回0。
测试用例:
代码开头的注释部分
代码实现:
#include<stdio.h>
#include<string.h>
#include<ctype.h> //isalpha()
// "4567890";
// "3456789876543234567876543"
// "0234567890"; //八进制,只处理 0234567
// "0x5678asdf"; //十六进制,只处理0x5678a
// "-6789";
// "+678";
// "7809.890"; //取整
// "wefasd"; // 0
int atoi(char *str,int n) //n=2,8,16(进制)
{
int a = 0,b;
int tmp = 0; //tmp保存上一次的结果a
char *p = str;
while (*p != '\0')
{
if (*p == '.') return a;//只取字符串的整数部分
if (isalpha(*p)) //处理含有英文字母的进制,比如十六进制
{
tmp = a;
b = *p - 'a' + 10; //将字母转换成相应的数字
if (b >= n) return a;// 如果该数字大于进制n;例如:十六进制 0x2dk,只需要转换 0x2d
a = a*n + b;
}
else
{
tmp = a;
b = *p - '0';
if (b >= n) return a;
a = a*n + b;
}
if( a < tmp) //超出整型所能表示的最大值
{
return 0;
}
p++;
}
return a;
}
int StrToInt(char *str)
{
int a = 0;//存放转换后的整形值
char *p = str;
if (isalpha(p[0]))
return 0; //如果第一个为英文字母,返回0
switch (p[0])
{
case '0':
if (*++p == 'x') //十六进制
a = atoi(++p,16);
else
a = atoi(p,8); //八进制
break;
case '-':
a = atoi(++p,10)*-1; //十进制负数
break;
case '+':
a = atoi(++p,10); //十进制正数
break;
case '*': //规定*开头表示二进制
a = atoi(++p, 2);
break;
//
//对于其他自定义进制字符串,增加相应的case
//
default:
a = atoi(p,10); //除此之外都为十进制
break;
}
return a;
}
int main()
{
char *str = "4567890000";
printf("%d\n",StrToInt(str));
return 0;
}
769

被折叠的 条评论
为什么被折叠?



