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

why only the index 0 changes him value to ""

我会直接

上下文:我正在制作刽子手游戏

脚本“错误”区域:

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

看到了吗????当我输入一个新的字母时,第一个字母变成空白space,但是如果我再次输入这个字母,它就会出现!!

我真的不知道怎么解决。

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

如果你想要完整的代码:

#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] != '[=11=]'){
        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;

}

好的,如果你正在努力学习,并且不受任何典型家庭作业规则的限制,你可以按照这些第一步正确地做事。

首先: 用 std::string 替换那些 char[]。 在 C++ 中,您已经构建了 类 来执行各种操作,管理字符串就是其中之一,而 std::string 是必经之路。

第二个: letter 实际上是一个字母,因此不需要是 char[1],它可以只是 char.

第三:尝试用英文写变量,大家分享代码的时候更容易。

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

P.s。我不会将你的代码的工作和改进版本放在一起,因为我认为你会学到更多,而不是仅仅从这里复制一些代码。

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

letra 定义为 1 个字符的数组。这是一个问题,因为当 cin >> letra; 读入 letra 时,它读取为空终止字符串而不是单个字符。不幸的是,1 个字符的数组中没有空间容纳一个字符和一个空终止符,因此 letra[0] 保存该字符,而 non-existent letra[1] 保存空终止符。这是越界写入并调用所谓的 Undefined Behaviour。从技术上讲,任何事情都有可能发生。

似乎正在发生的事情是 letra[1] 在内存中恰好与 palavra[0] 位于同一位置,因此 'b' 被空字符覆盖。

解决方案:

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

以后

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

让字符为单个字符。