噜啦噜啦噜呼呼呼 2024-02-02 19:49 采纳率: 70.7%
浏览 24

蓝桥杯十六进制转八进制

给定n个十六进制正整数,输出它们对应的八进制数。
输入的第一行为一个正整数n (1<=n<=10)。
接下来n行,每行一个由09、大写字母AF组成的字符串,表示要转换的十六进制正整数,每个十六进制数长度不超过100000。

#include<stdio.h>
#include<string.h>
#include<math.h>
void verse(char str[])
{
    int n=strlen(str),i,demp=0,k=0;
    for(i=0;i<n;i++)
    {
        if(str[i]>='0'&&str[i]<='9')
            demp+=(str[i]-'0')*pow(16,n-i-1);
        else
            demp+=(str[i]-'A'+10)*pow(16,n-i-1);
    }
    while(demp>0)
    {
        i=demp%8;
        str[k++]=(char)i;
        demp=demp/8;
    }
    for(i=k-1;i>=0;i--)
        printf("%d",str[i]);
    printf("\n");
}
int main()
{
    int n,i;
    char str[10][10];
    scanf("%d",&n);
    getchar();
    for(i=0;i<n;i++)
        gets(str[i]);
    for(i=0;i<n;i++)
        verse(str[i]);
    return 0;
}

为什么练习系统显示运行错误?呜

  • 写回答

3条回答 默认 最新

  • 专家-赤兔[在线] 全栈领域优质创作者 2024-02-02 19:51
    关注

    引自免费微信小程序:皆我百晓生

    经过分析,您的代码存在几个问题:

    1. 十六进制转十进制计算正确,但十进制转八进制处理有误

      • 在将十六进制转换为十进制时,您的代码是正确的。
      • 然而在将十进制数 demp 转换为八进制并存入字符串 str 时,错误地直接将八进制余数作为字符存储。应将其转换为对应的字符形式(0-7)。
    2. 输出格式不正确

      • 应该用 %o 输出八进制数字而非 %d
    3. 字符串中存放的是字符而非数值

      • 数字字符和实际数值是不同的,您不能直接将八进制数值以字符形式存入原字符串 str 中。
    4. 字符串结束符未处理

      • 将转换后的八进制数存入新的字符串时,没有考虑添加字符串结束符 \0

    修正后的代码如下:

    #include<stdio.h>
    #include<string.h>
    
    void hex_to_oct(char hex_str[])
    {
        int n = strlen(hex_str), i, demp = 0;
        for(i = 0; i < n; i++)
        {
            if(hex_str[i] >= '0' && hex_str[i] <= '9')
                demp += (hex_str[i] - '0') * pow(16, n - i - 1);
            else if(hex_str[i] >= 'A' && hex_str[i] <= 'F')
                demp += (hex_str[i] - 'A' + 10) * pow(16, n - i - 1);
        }
    
        char oct_str[100]; // 假设最大长度足以容纳结果
        int j = 0;
        while(demp > 0)
        {
            oct_str[j++] = '0' + demp % 8;
            demp /= 8;
        }
        oct_str[j] = '\0'; // 添加字符串结束符
    
        // 反转字符串,因为是从高位到低位计算的
        for(i = 0; i < j / 2; i++)
        {
            char temp = oct_str[i];
            oct_str[i] = oct_str[j - i - 1];
            oct_str[j - i - 1] = temp;
        }
    
        printf("%s\n", oct_str); // 使用 %s 输出字符串形式的八进制数
    }
    
    int main()
    {
        int n, i;
        scanf("%d", &n);
        getchar(); // 吃掉换行符
    
        char str[10][10];
        for(i = 0; i < n; i++)
            fgets(str[i], sizeof(str[i]), stdin); // 使用 fgets 替代 gets,避免安全问题
    
        for(i = 0; i < n; i++) 
        {
            // 移除每行末尾可能存在的换行符
            str[i][strcspn(str[i], "\n")] = '\0';
            hex_to_oct(str[i]);
        }
    
        return 0;
    }
    

    注意点:

    • fgets 替换了不安全的 gets 函数来读取输入字符串。
    • 十进制转八进制部分,将结果存入一个新的字符串,并在结束后添加字符串结束符 \0
    • 对得到的八进制字符串进行了反转,确保输出从高位到低位。

    请尝试使用这个修正过的代码片段,并根据需要调整缓冲区大小。

    评论

报告相同问题?

问题事件

  • 创建了问题 2月2日

悬赏问题

  • ¥15 Llama如何调用shell或者Python
  • ¥20 谁能帮我挨个解读这个php语言编的代码什么意思?
  • ¥15 win10权限管理,限制普通用户使用删除功能
  • ¥15 minnio内存占用过大,内存没被回收(Windows环境)
  • ¥65 抖音咸鱼付款链接转码支付宝
  • ¥15 ubuntu22.04上安装ursim-3.15.8.106339遇到的问题
  • ¥15 blast算法(相关搜索:数据库)
  • ¥15 请问有人会紧聚焦相关的matlab知识嘛?
  • ¥15 网络通信安全解决方案
  • ¥50 yalmip+Gurobi