问题描述:有一个由(0-9,a-f)字符组成的字符串,要将其转换成一个整数 。
假定条件:字符串长度不超过7,超范围时给出错误提示,并进行错误处理。
解决思路:一般性方法,递归法
1、一般性方法
- 解题思路:通过遍历合法字符串的方式,依次取得单个字符的值,然后进行数制转换;
- 出错处理:当输入字符串长度超过指定大小时,在本文为7(可使用宏定义#define进行设置),给出用户错误提示信息,然后处理字符串前7个字符,并返回处理结果。
核心转换函数:
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<Math.h>
/**
* 参数说明:str为传入的合法字符数组,length为该字符数组的长度
* 参数用途:str用来遍历获取字符,length用来作为乘方的次数
*/
long StringtoInt(char str[], int length){
int charNum = 0; //字符对应的十进制数值
long result = 0; //转换结果
int i = 0;
//遍历字符串
while(str[i] != '\0') {
//如果字符是0-9,转换成相应的十进制数
if(str[i]>='0'&&str[i]<='9')
charNum = str[i] - 48;
//如果字符是a-f,转换成相应的十进制数
if(str[i]>='a'&&str[i]<='f')
charNum = str[i] - 'a' + 10;
//将得到的十进制数依次乘方加和到结果上
result += charNum * pow(16, length - 1);
--length;
++i;
}
return result;
}
main函数:
int main(){
while(true){
char str[10];
int len = 0;
printf("請輸入要进行转换的字符串:\n");
gets(str);
//对输入字符串的长度进行检查
while(str[len] != '\0'){
if(len == 7){
printf("请输入长度不超过7的字符串\n");
break;
}
++len;
}
printf("转换结果为:");
printf("%ld\n",StringtoInt(str, len));
}
return 0;
}
测试结果:
2、递归法
- 递归定义: 递归简单来说就是在过程或函数里调用自身,在调用自身这个过程里,实质上是系统帮你把本次运行后程序相关的所有信息压入系统栈,待到达终止条件之后再一个个抛出来,最终返回结果。
- 递归需要满足的条件:有递归入口和递归终止条件,当终止条件不满足时,递归前进;当满足时,递归返回。 没有终止条件会爆栈。
- 解题思路:单次只转换字符数组最后一个字符,然后将字符数组长度减一,依次递归直到字符数组长度为0。
- 出错处理:当输入字符串长度超过指定大小时,在本文为7(可使用宏定义#define进行设置),给出用户错误提示信息,然后处理字符串前7个字符,并返回处理结果。
核心转换函数:
#include<stdio.h>
#include<Math.h>
int power = 0; //乘方的次数
long StringtoInt(char str[], int length){
int lastNum = 0; //结尾字符对应的整数值
//此处是递归的终止条件
if(length == 0){
power = 0;
return 0;
}
//获取字符数组的最后一个字符
char c = str[length - 1];
//将该字符转换成相应的数字
if(c >= '0' && c <= '9')
lastNum = c - 48;
if(c >= 'a' && c <= 'f')
lastNum = c -'a' + 10;
//将des字符数组的最后一个字符剔除掉
str[length - 1] = '\0';
//递归入口
return lastNum*pow(16,power++) + StringtoInt(str, --length);
}
main函数与前面的一样,这里就不做赘述了。
测试结果:
如发现错误或有其它解题思路,欢迎指正交流,一起学习,谢谢阅读。