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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 06:17:40