练习2-3 编写函数htoi(s),把由16进制数字组成的字符串(包含可选的前缀0X或0x)转换成与之等价的整形值。字符串中允许包含的数字包括:0 ~ 9, a ~ f,A ~ F。

练习2-3 编写函数htoi(s),把由16进制数字组成的字符串(包含可选的前缀0X或0x)转换成与之等价的整形值。字符串中允许包含的数字包括:0~9,a~f,A~F。


参考代码:

#include<stdio.h>
#define YES 1
#define NO 0

//htoi: covert hexadecimal string s to interger
int htoi(char s[])
{
    int hexdigit, i, inhex, n;

    i = 0;
    if(s[i] == '0') //skip optional 0x or 0X
    {
        ++i;
        if(s[i] == 'x' || s[i] == 'X')
        {
            ++i;
        }
    }
    n = 0;  //interger value to be returned
    inhex = YES;    //assume valid hexadecimal digit
    for( ; inhex == YES; ++i)
    {
        if(s[i] >= '0' && s[i] <= '9')
            hexdigit = s[i] - '0';
        else if(s[i] >= 'a' && s[i] <= 'f')
            hexdigit = s[i] - 'a' + 10;
        else if(s[i] >= 'A' && s[i] <= 'F')
            hexdigit = s[i] - 'A' + 10;
        else
            inhex = NO;  //not a valid hexadecimal digit
        if(inhex == YES)
            n = 16 * n + hexdigit;
    }
    return n;
}
int main()
{
    char s[] = "0xfff23";
    int n;
    n = htoi(s);
    printf("%d", n);
    return 0;
}


### 将十六进制字符串转换为十进制整数 在不同编程语言中,将十六进制字符串转换为十进制整数的方式有所不同。以下是几种常见编程语言的具体实现。 #### Java 实现 Java 提供了内置方法 `Integer.parseInt` 来完成这一操作。该方法接受两个参数:待解析的字符串以及基数(对于十六进制而言,基数应设为 16)。下面是一个完整的代码示例: ```java public class HexToDecimal { public static void main(String[] args) { String hexString = "FF"; // 示例十六进制字符串 try { int decimalValue = Integer.parseInt(hexString, 16); // 转换为十进制 System.out.println("十六进制字符串 &#39;" + hexString + "&#39; 对应的十进制为:" + decimalValue); } catch (NumberFormatException e) { System.err.println("非法的十六进制字符串!"); } } } ``` 这种方法能够有效验证输入字符串是否合法并执行转换[^1]。 --- #### C++ 实现 C++ 可以利用标准库中的流操作符函数来完成类似的转换。以下是一段基于 `std::stoi` 的代码示例: ```cpp #include <iostream> #include <string> int main() { std::string hexString = "FF"; // 示例十六进制字符串 try { int decimalValue = std::stoi(hexString, nullptr, 16); // 基数设置为16 std::cout << "十六进制字符串 &#39;" << hexString << "&#39; 对应的十进制为:" << decimalValue << std::endl; } catch (const std::invalid_argument& ia) { std::cerr << "非法的十六进制字符串!" << std::endl; } return 0; } ``` 这段代码展示了如何使用现代 C++ 特性安全地进行转换[^2]。 --- #### C# 实现 C# 提供了一个简洁的方法——`Convert.ToInt32`,可以直接用于将十六进制字符串转换为十进制整数。下面是具体的代码示例: ```csharp using System; class Program { static void Main() { string hexString = "FF"; // 示例十六进制字符串 try { int decimalValue = Convert.ToInt32(hexString, 16); // 基数为16 Console.WriteLine($"十六进制字符串 &#39;{hexString}&#39; 对应的十进制为:{decimalValue}"); } catch (FormatException) { Console.Error.WriteLine("非法的十六进制字符串!"); } } } ``` 这种方式不仅高效而且易于理解和维护[^3]。 --- #### Python 实现 Python 是一种语法简洁的语言,在处理此类问题时尤为方便。可以通过内置函数 `int()` 并指定基数为 16 完成转换: ```python hex_string = "FF" # 示例十六进制字符串 try: decimal_value = int(hex_string, 16) # 转换为十进制 print(f"十六进制字符串 &#39;{hex_string}&#39; 对应的十进制为:{decimal_value}") except ValueError: print("非法的十六进制字符串!") ``` 这种做法同样支持错误检测机制,确保程序运行的安全性和稳定性[^4]。 --- #### C 实现 在 C 语言中,可以自定义一个函数来完成十六进制到十进制的转换。例如,通过遍历字符串每一位字符逐步累加计算最终结果。这里提供一段参考代码: ```c #include <stdio.h> #include <ctype.h> // 自定义 htoi 函数 int htoi(const char s[]) { int i = 0, n = 0; while (s[i]) { if (&#39;0&#39; <= s[i] && s[i] <= &#39;9&#39;) { n = 16 * n + (s[i] - &#39;0&#39;); } else if (&#39;a&#39; <= tolower(s[i]) && tolower(s[i]) <= &#39;f&#39;) { n = 16 * n + (tolower(s[i]) - &#39;a&#39; + 10); } else { printf("非法字符:%c\n", s[i]); return -1; // 返回错误标志 } ++i; } return n; } int main(void) { const char* hexString = "FF"; int result = htoi(hexString); if (result != -1) { printf("十六进制字符串 &#39;%s&#39; 对应的十进制为:%d\n", hexString, result); } return 0; } ``` 此方案适用于需要完全控制底层逻辑的情况[^5]。 --- ### 总结 无论采用哪种编程语言,核心思路都是先确认输入的有效性再依据特定算法工具将其映射至目标数体系之中。每种语言都有各自的优劣之处,开发者可根据实际需求灵活选用合适的技术手段。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值