【C语言】循环、递归 将由十六进制字符组成的字符串转换成整数

问题描述:有一个由(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函数与前面的一样,这里就不做赘述了。

测试结果:
递归法的测试结果


如发现错误或有其它解题思路,欢迎指正交流,一起学习,谢谢阅读。

  • 3
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值