You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

十进制转十六进制C++程序无输出问题排查及修改方案咨询

问题分析与修复方案

首先,你的程序存在两个关键问题:代码逻辑的错误,以及运行方式的不当,我们逐一解决:

一、先纠正运行方式的问题

你用./a 479启动程序,但代码是通过cin >> n读取控制台输入的,而非命令行参数。正确的操作流程应该是:

PS C:\Users\anmol\Desktop\c++projectwork> g++ .\dec2hexadec.cpp
PS C:\Users\anmol\Desktop\c++projectwork> ./a.exe
# 此时在控制台输入479并回车

如果想直接通过命令行传参,可以后续修改main函数读取argv,但先优先修复代码本身的问题。

二、代码的核心错误与修复

你的字符串操作存在未定义行为,还有结果顺序颠倒的问题,具体问题和修复方式如下:

  • 空字符串直接下标赋值:string s, t;初始化的是空字符串,没有分配内存空间,直接用s[i] = t[i]会导致内存越界,程序可能静默崩溃或无输出。应该用push_back()或+=向字符串末尾添加字符。
  • 结果顺序颠倒:十进制转十六进制时,我们先得到的是低位数值(比如479除以16余15即F,接着是29余13即D,最后是1),收集到的字符是F、D、1,必须反转才能得到正确的1DF。
  • 未处理n=0的情况:如果输入0,循环不会执行,会返回空字符串,需要单独处理这个边界场景。
  • 冗余头文件:#include <math.h>在代码中没有用到,可以删除。

修改后的完整代码

// decimal to hexadecimal conversion
#include <iostream>
#include <string>
#include <algorithm> // 用于reverse反转字符串
using namespace std;

string d2h(int n) {
    // 处理输入为0的特殊情况
    if (n == 0) {
        return "0";
    }
    
    string s;
    while (n > 0) {
        int remainder = n % 16;
        char c;
        if (remainder >= 10) {
            // 将10-15转换为A-F字符
            c = 'A' + (remainder - 10);
        } else {
            // 将0-9转换为'0'-'9'字符
            c = '0' + remainder;
        }
        s.push_back(c);
        n /= 16;
    }
    // 反转字符串得到正确的十六进制顺序
    reverse(s.begin(), s.end());
    return s;
}

int main() {
    int n;
    cin >> n;
    cout << d2h(n) << endl; // 加endl确保输出立即刷新到控制台
    return 0;
}

三、验证修复后的运行结果

按照正确流程运行:

PS C:\Users\anmol\Desktop\c++projectwork> g++ .\dec2hexadec.cpp
PS C:\Users\anmol\Desktop\c++projectwork> ./a.exe
479
1DF

此时就能得到正确的十六进制转换结果了。

如果需要支持负数的十六进制转换,可以额外处理补码逻辑,当前代码默认适配非负整数场景。

内容的提问来源于stack exchange,提问作者anmol065

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.30 16:42:27