You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Hangman游戏触发string subscript out of range断言错误求助

解决Hangman游戏的"string subscript out of range"断言错误

嘿,我帮你找到了触发这个断言错误的核心原因,还有代码里几个影响游戏正常运行的逻辑问题,咱们一步步拆解:

1. 直接导致越界的循环条件bug

你在检查猜测字母的for循环里写了这么一行:

for (int i = 0; i, Palabra.length(); i++)

这里的逗号运算符i, Palabra.length()会直接忽略第一个值,返回后面的Palabra.length()。只要你的待猜单词长度大于0,这个条件就永远为真,循环会一直让i往上加,直到i超过字符串的最大下标(字符串下标从0开始,最大是length()-1),这时候访问Palabra[i]就直接触发了字符串下标越界的断言错误——这就是你遇到的问题根源!

正确的写法应该是判断i小于字符串长度:

for (int i = 0; i < Palabra.length(); i++)

2. 游戏提前终止的return语句

你的while循环里,每次处理完一次猜测就直接return misses;了,这会导致程序只跑一轮就退出,根本没法进行多轮猜测的游戏流程。这个return必须移到游戏真正结束的分支里(比如全部字母猜对,或者猜错6次的时候)。

3. 其他影响体验的小问题

  • 原提示语句表述不通顺,比如Adivina las " << display << " letras,我调整成了更清晰的提示格式;
  • 缺少猜错6次的结束逻辑,按照你的需求,当错误次数到6次时应该直接显示答案结束游戏;
  • 重复猜测的判断有漏洞,原代码只要找到一个已填充的位置就判定重复,但应该检查所有位置,确保这个字母的所有出现都已经被猜中了。

修复后的完整代码

#include <iostream>
#include <string>
using namespace std;

string Palabra;

int main() {
    cout << "Bienvenido a 'Hangman'\n\nPor favor, entre su palabra para adivinar: ";
    getline(cin, Palabra);

    int misses = 0;
    int exposed = 0;
    string display = Palabra;
    // 将display替换为下划线,和待猜单词长度一致
    for (int i = 0; i < display.length(); i++) {
        display[i] = '_';
    }

    // 游戏主循环:未猜完所有字母且错误次数未达6次
    while (exposed < Palabra.length() && misses < 6) {
        cout << "\nIntentos fallidos: " << misses << "/6\n";
        cout << "Palabra a adivinar: " << display << "\n";
        cout << "Ingresa una letra para adivinar: ";
        
        char response;
        cin >> response;
        // 忽略输入缓冲区的换行符,避免后续如果用getline出现异常
        cin.ignore();

        bool goodGuess = false;
        bool duplicate = true; // 默认假设是重复猜测,后续验证

        for (int i = 0; i < Palabra.length(); i++) {
            if (response == Palabra[i]) {
                if (display[i] == Palabra[i]) {
                    // 这个位置已经被填充,继续检查其他位置
                    continue;
                } else {
                    // 填充对应位置,计数加一
                    display[i] = Palabra[i];
                    exposed++;
                    goodGuess = true;
                    duplicate = false; // 不是重复猜测
                }
            }
        }

        // 只有当该字母的所有位置都已被填充时,才提示重复
        if (duplicate && goodGuess == false) {
            cout << "\nLa letra '" << response << "' ya fue adivinada!\n";
            continue;
        }

        if (!goodGuess) {
            misses++;
            cout << "\nLa letra '" << response << "' no esta en la palabra.\n";
        } else {
            cout << "\n¡Acierto! La letra '" << response << "' esta en la palabra.\n";
        }
    }

    // 游戏结束后的结果展示
    if (exposed == Palabra.length()) {
        cout << "\n¡Felicidades! Adivinaste la palabra: " << Palabra << "\n";
        cout << "Numero de intentos fallidos: " << misses << "\n";
    } else {
        cout << "\n¡Perdiste! Se acabaron los intentos. La palabra era: " << Palabra << "\n";
    }

    system("pause");
    return 0;
}

修复后的核心变化

  • 修正了循环越界的问题,确保只在字符串合法下标范围内访问;
  • 移除了提前终止的return语句,让游戏能正常进行多轮猜测;
  • 加入了错误次数达6次的结束判断,符合你最初的需求;
  • 优化了重复猜测的判断逻辑,避免误判;
  • 调整了提示信息的格式,让游戏体验更流畅。

内容的提问来源于stack exchange,提问作者Koran J Miranda Viera

火山引擎 最新活动