C++罗马数字转整数输出始终为-858993460,求助排查问题
问题根源与解决方案
首先,你看到的-858993460其实是未初始化int变量的垃圾值(对应十六进制的0xCCCCCCCC,是VS调试模式下未初始化栈变量的默认填充值)。咱们一步步梳理问题并给出修复方案:
1. 核心问题:成员变量num未初始化
C++不会自动初始化类的非静态成员变量,你的两个构造函数都没给num赋值初始值,导致对象创建后num的内存里是随机垃圾值:
// 默认构造函数:缺少num初始化 romanType::romanType() { } // 带参构造函数:同样缺少num初始化 romanType::romanType(string n) { romanString = n; }
2. 调用顺序错误:没触发转换逻辑就输出
主函数里,你设置了罗马数字字符串后,直接调用printPositiveInteger(),但没有先调用romanToPositiveInteger()执行转换计算,此时num还是原来的垃圾值;而且第一次循环时,你甚至还没设置罗马字符串就调用了printNum(),输出自然是垃圾值:
// 错误的顺序:先输出,再设置字符串,还没转换 roman.printNum(); roman.setRoman(romanString); roman.printPositiveInteger();
3. 冗余代码隐患:循环里多余的i++
在romanToPositiveInteger()的循环末尾,你额外加了i++,但for循环本身会自动执行i++,这会导致i多走一步,虽然最后一个元素的场景不影响结果,但逻辑上容易引发错误:
else { num = num + s1; i++; // 这个i++完全多余 }
修复后的完整代码示例
构造函数修复(初始化num)
推荐用初始化列表的方式,更符合C++规范:
romanType::romanType() : num(0) { } romanType::romanType(string n) : romanString(n), num(0) { }
主函数调用顺序修复
调整顺序,先判断退出条件,再设置字符串、执行转换、最后输出:
int main() { romanType roman; string romanString; while (true) { cout << "Enter a roman number: "; cin >> romanString; if (romanString == "EXIT") break; // 提前判断退出,避免处理无效字符串 roman.setRoman(romanString); roman.romanToPositiveInteger(); // 先执行转换计算 cout << "The equivalent of the Roman numeral " << romanString << " is "; roman.printPositiveInteger(); cout << "\n\n"; } std::cout << "\n\n---------------------------------\n"; system("pause"); return EXIT_SUCCESS; }
移除冗余的i++
void romanType::romanToPositiveInteger() { num = 0; for (int i = 0; i < romanString.length(); i++) { int s1 = value(romanString[i]); if (i + 1 < romanString.length()) { int s2 = value(romanString[i + 1]); if (s1 >= s2) { num += s1; } else { num += s2 - s1; i++; // 这里的i++是必要的,跳过已处理的下一个字符 } } else { num += s1; // 删掉这里的i++ } } }
额外新手友好建议
- 不要在头文件里写
using namespace std;,容易引发命名冲突,头文件里用std::string代替即可。 - 可以把全局的
value函数改成romanType的静态成员函数,逻辑上更贴合类的职责。 printPositiveInteger()作为const成员函数,要确保调用它之前num已经被正确赋值,避免输出垃圾值。
内容的提问来源于stack exchange,提问作者H. Earley
相关产品推荐
相关产品推荐

