十进制转十六进制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
相关产品推荐
相关产品推荐

