十六进制字符串转化为十进制数值

本文介绍了一个将十六进制字符串转换为十进制数值的C++函数。该函数首先检查输入字符串是否以0x开头,然后遍历每个字符并计算对应的十进制值。
以下代码是把十六进制字符串转化为十进制数值

转换函数是hexStr2decimal,代码如下。

#include <iostream>
#include <map>
#include <string>
#include <math.h>
using namespace std;
//function transfer hex string to deciaml
bool hexStr2decimal(string &str, int &decimal)
{
    if(str[0]=='0'&& str[1]=='x'){
        decimal = 0;
        int strSize = str.size();
        for(int i=2; i<strSize; i++){
            if(str[i]<='9' && str[i]>='0')
                decimal += static_cast<int>((str[i]-'0')*pow(16,strSize-i-1));
            else if(str[i]<='F' && str[i]>='A')
                decimal += static_cast<int>((str[i]-'A'+10)*pow(16,strSize-i-1));
            else
                return false;   
        }
        return true;
    }else{
        return false;
    }
}
int main()
{
    string str;
    int decimal;
    while(cin>>str){
        if(hexStr2decimal(str,decimal))
            cout<<decimal<<endl;
    }
    return 0;
}
<think>根据用户需求,我们需要编写一个将十六进制字符串换为十进制整数的C语言程序。参考引用内容,我们可以采用以下方法: 1. 读取一个十六进制字符串(可能包含大小写字母和数字) 2. 过滤掉非十六进制字符(只处理0-9, A-F, a-f) 3. 将每个十六进制字符转换为对应的数值(0-15) 4. 通过累加(每个数字乘以16的相应次方)得到十进制整数 注意:由于整数范围可能较大,我们使用`long`类型来存储结果,以避免溢出(但实际仍受限于`long`的范围,对于超大整数需要特殊处理,这里先按常规处理)。 另外,根据引用[2]和引用[4]的思路,我们可以编写一个换函数,同时处理大小写字母。 代码设计: 函数:`long hexToDec(const char *hexStr)` 功能:将十六进制字符串(可包含前缀0x或没有)换为十进制整数 步骤: - 跳过可能的前缀"0x"或"0X" - 逐个字符处理,直到字符串结束 - 如果字符是十六进制数字(0-9, a-f, A-F),则将其换为数值,并累加到结果中(每次乘以16) - 忽略非十六进制字符 注意:如果字符串为空或没有有效字符,则返回0。 另外,我们也可以参考引用[4]的Python代码思路,先过滤无效字符,再换。 由于用户要求用C语言,我们实现如下: </think> # C语言实现十六进制字符串换为十进制整数 以下是完整的C语言程序,实现将十六进制字符串换为十进制整数: ```c #include <stdio.h> #include <ctype.h> #include <string.h> #include <math.h> // 十六进制字符转换数值 int hexCharToValue(char c) { if (c >= '0' && c <= '9') return c - '0'; if (c >= 'A' && c <= 'F') return c - 'A' + 10; if (c >= 'a' && c <= 'f') return c - 'a' + 10; return -1; // 非十六进制字符 } // 十六进制字符串换为十进制整数 long hexStringToDecimal(const char *hexStr) { long result = 0; int len = strlen(hexStr); int startIndex = 0; // 检查是否有"0x"或"0X"前缀 if (len > 2 && hexStr[0] == '0' && (hexStr[1] == 'x' || hexStr[1] == 'X')) { startIndex = 2; } // 从最高位开始处理 int power = len - startIndex - 1; for (int i = startIndex; i < len; i++) { int value = hexCharToValue(hexStr[i]); if (value < 0) { printf("无效的十六进制字符: %c\n", hexStr[i]); return -1; // 返回错误 } result += value * pow(16, power); power--; } return result; } int main() { char hexStr[100]; printf("请输入十六进制字符串: "); scanf("%99s", hexStr); // 限制输入长度防止溢出 long decimal = hexStringToDecimal(hexStr); if (decimal >= 0) { printf("换结果: %ld\n", decimal); } else { printf("换失败: 输入包含无效字符\n"); } return 0; } ``` ## 关键实现说明 1. **字符转换函数**: ```c int hexCharToValue(char c) { if (c >= '0' && c <= '9') return c - '0'; if (c >= 'A' && c <= 'F') return c - 'A' + 10; if (c >= 'a' && c <= 'f') return c - 'a' +10; return -1; // 非十六进制字符 } ``` 这个函数将单个十六进制字符转换为对应的数值(0-15)[^1] 2. **主换函数**: ```c long hexStringToDecimal(const char *hexStr) { // ... 处理0x前缀 for (int i = startIndex; i < len; i++) { int value = hexCharToValue(hexStr[i]); result += value * pow(16, power); power--; } return result; } ``` 从最高位开始计算,使用公式: $$result = \sum_{i=0}^{n} (digit_i \times 16^{position})$$ 3. **错误处理**: - 自动跳过"0x"或"0X"前缀 - 检测无效十六进制字符 - 使用`long`类型支持更大的数值范围 ## 示例输入输出 ``` 请输入十六进制字符串: 1A3 换结果: 419 请输入十六进制字符串: 0xFF 换结果: 255 请输入十六进制字符串: 7DE 换结果: 2014 ``` ## 数学原理 十六进制十进制的数学公式: $$decimal = d_n \times 16^n + d_{n-1} \times 16^{n-1} + \cdots + d_0 \times 16^0$$ 其中$d_i$是十六进制数字十进制值,$n$是数字的位置(从右向左,从0开始计数)[^3]。 ## 优化版(避免使用pow函数) ```c long hexStringToDecimal(const char *hexStr) { long result = 0; int len = strlen(hexStr); int startIndex = 0; // 检查前缀 if (len > 2 && hexStr[0] == '0' && (hexStr[1] == 'x' || hexStr[1] == 'X')) { startIndex = 2; } // 更高效的换方法 for (int i = startIndex; i < len; i++) { int value = hexCharToValue(hexStr[i]); if (value < 0) { printf("无效的十六进制字符: %c\n", hexStr[i]); return -1; } result = result * 16 + value; } return result; } ``` 此版本避免了幂运算,直接使用$result = result \times 16 + currentDigit$算法[^2],效率更高。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值