2501_93528148 2025-10-14 17:18 采纳率: 75%
浏览 5
已结题

C语言十六进制转化十进制

十六进制转十进制发生异常,不知道是哪里有问题,自学C语言,有没有人可以解答一下

img

img

img

  • 写回答

5条回答 默认 最新

  • 宝码香车 优质创作者: JavaScript技术领域 2025-10-14 17:22
    关注

    让【宝码香车】来帮您解答,本回答参考DeepSeek编写,并整理提供。

    如果答案让您满意,请采纳、点赞、关注,非常感谢!
    .
    每日一句正能量,让它带给您好心情:你若盛开,清风自来;你若努力,幸运自会青睐。
    .

    根据你提供的代码和错误信息,这是一个典型的缓冲区溢出问题。让我分析一下代码中的问题并提供修复方案。

    问题分析

    从错误信息可以看出,问题出现在堆栈Cookie检测代码检测到基于堆栈的缓冲区溢出。主要问题有:

    1. 缓冲区大小不足char six[100] 可能不够大
    2. 输入函数使用不当scanf 没有限制输入长度
    3. 数组越界访问

    修复后的代码

    #include <stdio.h>
    #include <math.h>
    #include <string.h>
    
    
    int main()
    {
        char six[256];  // 增大缓冲区
        printf("请输入一个十六进制数: ");
        
        // 安全的输入方式,限制输入长度
        if (scanf("%255s", six) != 1) {
            printf("输入错误\n");
            return 1;
        }
        
        int len = strlen(six);
        int ten = 0;
        int num = 0;
        int valid = 1;  // 输入有效性标志
        
        for (int i = 0; i < len; i++) {
            char a = six[i];
            
            if (a >= '0' && a <= '9') {
                num = a - '0';
            }
            else if (a >= 'A' && a <= 'F') {
                num = a - 'A' + 10;
            }
            else if (a >= 'a' && a <= 'f') {
                num = a - 'a' + 10;
            }
            else {
                printf("错误:无效的十六进制字符 '%c'\n", a);
                valid = 0;
                break;
            }
            
            ten += num * pow(16, len - 1 - i);
        }
        
        if (valid) {
            printf("十进制结果: %d\n", ten);
        }
        
        return 0;
    }
    

    主要修复点

    1. 增大缓冲区:从 char six[100] 改为 char six[256]
    2. 安全的输入:使用 scanf("%255s", six) 限制输入长度
    3. 输入验证:检查返回值并添加有效性检查
    4. 错误处理:添加无效字符的检测和错误提示

    更安全的替代方案

    如果你想要更安全的版本,可以使用 fgets

    #include <stdio.h>
    #include <math.h>
    #include <string.h>
    
    
    int main()
    {
        char six[256];
        printf("请输入一个十六进制数: ");
        
        if (fgets(six, sizeof(six), stdin) == NULL) {
            printf("输入错误\n");
            return 1;
        }
        
        // 移除换行符
        six[strcspn(six, "\n")] = '\0';
        
        int len = strlen(six);
        int ten = 0;
        int num = 0;
        int valid = 1;
        
        for (int i = 0; i < len; i++) {
            char a = six[i];
            
            if (a >= '0' && a <= '9') {
                num = a - '0';
            }
            else if (a >= 'A' && a <= 'F') {
                num = a - 'A' + 10;
            }
            else if (a >= 'a' && a <= 'f') {
                num = a - 'a' + 10;
            }
            else {
                printf("错误:无效的十六进制字符 '%c'\n", a);
                valid = 0;
                break;
            }
            
            ten += num * pow(16, len - 1 - i);
        }
        
        if (valid) {
            printf("十进制结果: %d\n", ten);
        }
        
        return 0;
    }
    

    使用示例

    输入:

    1A3F
    

    输出:

    十进制结果: 6719
    

    这样修复后应该就不会出现缓冲区溢出的异常了。主要记住在C语言中处理用户输入时,一定要限制输入长度,防止缓冲区溢出。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(4条)

报告相同问题?

问题事件

  • 系统已结题 10月22日
  • 已采纳回答 10月14日
  • 创建了问题 10月14日