代码之家  ›  专栏  ›  技术社区  ›  user196053

为什么只有索引0将him值更改为“”

  •  -1
  • user196053  · 技术社区  · 4 年前

    我马上就来

    背景:我在做一个刽子手游戏

    脚本“bug”区域:

    while(lifes > 0){
    
        cout << "word: ";
        for(int i=0; i<size; i++){
        cout << secret[i];
        }
    
    cout << endl;
    cout << "lifes: " << lifes << endl;
    
    cout << endl << "choose a letter..." << endl;
    cin >> letter;
    
    check=false;
    for(int i=0; i<size; i++){
    
        if(key[i] == letter[0]){
        secret[i] = letter[0];
        check=true;
        } 
    
    }
    
    if(check == false){
      lifes--;
    }
    }
    

    问题是:

    我将模拟发生的情况:

    让我们把这个秘密的词当作“熊”,好吗?

    第一个回路=

    word: ----
    lifes: 5
    
    cin >> 'b'
    

    第二个回路=

    word: b---
    lifes: 5
    
    cin >> 'a'
    

    第三个回路=

    word: -a-
    lifes: 5
    
    cin >> 'b'
    

    第四个回路=

    word: b-a-
    lifes: 5
    

    看见当我输入一个新字母时,第一个字母会变成一个空格,但如果我再次输入该字母,它就会出现!!

    我真的不知道怎么解决这个问题。

    谢谢你的帮助,也很抱歉英语不好,哈哈。

    如果需要完整代码:

    #include <iostream>
    #include <cstdlib>
    
    using namespace std;
    
    int main(){
    
        //definição de variáveis
        
        char chave[50], palavra[50], letra[1];
        int tam=0, pos=0, vidas=5;
        bool acerto=false;
        
        //estabelecendo palavra-chave
        cout << "Qual a palavra?" << endl;
        cin >> chave;
        
        system("cls");
        
        //descobrindo o tamanho da palavra-chave
        while(chave[pos] != '\0'){
            tam++;
            pos++;
        }
        
        //escondendo a palavra secreta
        for(int i=0; i<tam; i++){
            palavra[i] = '-';
        }
        
        /*
        .
        . etapa 1
        .
        */
        
        while(vidas > 0){
            
            //criar painel
            cout << "Palavra: ";
            for(int i=0; i<tam; i++){
                cout << palavra[i];
            }
            cout << endl;
            cout << "Vidas: " << vidas << endl;
            
            cout << endl << "Escolha uma letra..." << endl;
            cin >> letra;
            
            //verificar se tem algum caracter identico à letra
            acerto=false;
            for(int i=0; i<tam; i++){
                
                if(chave[i] == letra[0]){
                    palavra[i] = letra[0];
                    acerto=true;
                } 
            }
            
            if(acerto == false){
                vidas--;
            }
            
            //fim do loop
            system("pause");
            system("cls");
        }
        
        
        
        return 0;
    
    }
    
    0 回复  |  直到 4 年前
        1
  •  1
  •   user4581301    4 年前
    char chave[50], palavra[50], letra[1];
    

    定义 letra 作为1个字符的数组。这是一个问题,因为当 cin >> letra; 读入 莱特拉 ,它读取为以null结尾的字符串,而不是单个字符。不幸的是,在1个字符的数组中没有空间容纳一个字符和一个空终止符,所以 letra[0] 保存角色和不存在的 letra[1] 保留空终止符。这是一个写越界并调用 Undefined Behaviour . 从技术上讲,任何事情都可能发生。

    似乎正在发生的是 莱特拉【1】 恰好与 palavra[0] ,因此 'b' 被空字符覆盖。

    解决方案:

    char chave[50], palavra[50], letra;
    

    以及以后

    if(chave[i] == letra){
        palavra[i] = letra;
        acerto=true;
    }
    

    让角色为单个角色。

        2
  •  0
  •   Federico    4 年前

    好的,考虑到你正在努力学习,并且你不受任何典型家庭作业规则的限制,你可以遵循以下第一步来正确地做事。

    第一: 更换这些 char[] 具有 std::string s 在c++中,已经构建了用于执行各种任务的类,管理字符串就是其中之一,并且 标准::字符串 就是要走的路。

    第二个: letter 字面上是一个字母,所以不需要是 char[1] 它可能只是 char .

    第三:尝试用英语编写变量,当您要共享代码时,对任何人来说都更容易。

    从这些简单的步骤开始,您将编写更好的代码,顺便帮助您避免错误。

    P、 我不会给你的代码添加一个有效的改进版本,因为我认为你会学到更多的东西,而不仅仅是从这里复制一些代码。

    推荐文章