当前位置:   article > 正文

c语言(编程题:十六进制数转换为十进制)_c语言16进制转10进制整数

c语言16进制转10进制整数

C语言

题目

写一个函数,输入一个十六进制数,输出相应的十进制数。

基础知识

1. 十六进制定义

-------16进制即逢16进1,每一位上可以是从小到大为0、1、2、3、4、5、6、7、8、9、A、B、C、D、E、F共16个大小不同的数。16进制转换即16进制与其他不同进制之间的换算转换,常见如2进制、8进制、10进制等进制。
且16进制的标准表示一般为0x后跟数字

2. 十六进制转换

-------十六进制转换有16进制每一位上可以是从小到大为0、1、2、3、4、5、6、7、8、9、A、B、C、D、E、F16个大小不同的数,即逢16进1,其中用A,B,C,D,E,F(字母不区分大小写)这六个字母来分别表示10,11,12,13,14,15。

3. 各种进制对照表:
在这里插入图片描述

分析题目

  • 首先明白16进制如何通过计算转换为10进制。

--------16进制数的第0位的权值为16的0次方,第1位的权值为16的1次方,第2位的权值为16的2次方……所以,在第N(N从0开始)位上,如果是是数 X (X 大于等于0,并且X小于等于 15,即:F)表示的大小为 X * 16的N次方。

  • 举例: 将0x2AF5换算成10进制
    5 * 16^0 + F * 16^1 + A * 16^2 + 2 * 16^3 = 10997

编程解决

将问题分析过后我们知道了两种进制转换的原理,也会进行进制转换的计算,现在我们需要把这些数学思想转换为编程语言。
并且在进制转换的编程中有许多小问题一下将会做出详解。

1.先定义编写函数的名称:

int Get_0x(const char* str)//将函数命名为Get_0x 并且形参为不可修改的字符串 
  • 1

2.进制转换函数用到的头文件:

#include <stdio.h>//标准库函数
#include <ctype.h>//特殊字符判断的头文件
#include <string.h>//字符串操作用到的头文件
#include <limits.h>//检测整型数据类型的表达式范围
  • 1
  • 2
  • 3
  • 4

3.如果遇到空格的处理:

while (isspace(*str))
	{
		str++;//因为空格在转换过程中对数值没有影响,直接++后移进行后续操作
	}
  • 1
  • 2
  • 3
  • 4

4.正负号的判断及解决方法:

int index = 1;
	if (*str == '-' || *str == '+')
	{
		if (*str == '-')
		{
			index *= -1;
		}
		else
		{
			index = 1;
		}
		str++;
	}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

5.判断前两位是否是0X 16进制的表达形式:

	if ((*str == '0') && (*(str + 1) == 'x' || *(str + 1) == 'X'))      //判断前两位是否是0X 16进制的表达形式
	{
		str += 2;     //如果是从第三位开始换算计算
	}
	else
	{
		return INT_MAX;
	}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

6.判断是否是字符:

while (isxdigit(*str))        //判断是否是字符
	{
		if (isdigit(*str))    //如果是字符按位进行操作 这部分就是将数学思想转变为编程语言
		{
			sum = sum * 16 + (*str - '0');
		}
		else if (islower(*str))
		{
			sum = sum * 16 + (*str - 'a' + 10);
		}
		else
		{
			sum = sum * 16 + (*str - 'A' + 10);
		}
		str++;
	}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16

7.结束标志:

if (*str == '\0')
		return sum * index;
	return INT_MAX;
  • 1
  • 2
  • 3

上述就是进制转换各部分的代码及其实现的功能。

全部代码

#include <stdio.h>
#include <ctype.h>
#include <string.h>
#include <limits.h>
int Get_0x(const char* str)
{
	int sum = 0;
	while (isspace(*str))
	{
		str++;
	}
	//此时 空格处理结束
	int index = 1;
	if (*str == '-' || *str == '+')
	{
		if (*str == '-')
		{
			index *= -1;
		}
		else
		{
			index = 1;
		}
		str++;
	}

	if ((*str == '0') && (*(str + 1) == 'x' || *(str + 1) == 'X'))      //判断前两位是否是0X 16进制的表达形式
	{
		str += 2;     //如果是从第三位开始换算计算
	}
	else
	{
		return INT_MAX;
	}

	while (isxdigit(*str))        //判断是否是字符
	{
		if (isdigit(*str))
		{
			sum = sum * 16 + (*str - '0');
		}
		else if (islower(*str))
		{
			sum = sum * 16 + (*str - 'a' + 10);
		}
		else
		{
			sum = sum * 16 + (*str - 'A' + 10);
		}
		str++;
	}
	if (*str == '\0')
		return sum * index;
	return INT_MAX;
}

int main()
{
	printf("%d\n", Get_0x("0x123ABcW"));
	printf("%d\n", Get_0x("0X123ABc"));
	printf("%d\n", Get_0x("      0x123ABc"));//对空格判断
	printf("%d\n", Get_0x("+0x123ABc"));//+判断
	printf("%d\n", Get_0x("-0x123ABc"));//-判断
	printf("%d\n", Get_0x("  +0x123ABc"));//+和空格判断
	printf("%d\n", Get_0x("   -0x123ABc"));//-和空格判断
	printf("%d\n", Get_0x("0x2AF5"));//对上述举例进行验证
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67

验证结果

在这里插入图片描述

(小白一位,如有问题,欢迎各位大佬指正)

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/我家小花儿/article/detail/244514
推荐阅读
相关标签
  

闽ICP备14008679号