我将直接成为
上下文:我正在制作一个刽子手游戏
脚本"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--;
}
}
问题:
我将模拟发生的情况:
让我们把这个秘密单词取为";熊";,好啊
第一个循环=
单词:----寿命:5cin>>'b'
第二个循环=
单词:b---寿命:5cin>>"a">
第三个循环=
单词:-a-寿命:5cin>>'b'
第四个循环=
单词:b-a-寿命: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] != ' '){
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;
}
char chave[50], palavra[50], letra[1];
将CCD_ 1定义为一个包含1个字符的数组。这是一个问题,因为当cin >> letra;
读取letra
时,它读取的是以null结尾的字符串,而不是单个字符。不幸的是,在一个1个字符的数组中没有一个字符和一个null终止符的空间,因此letra[0]
保存该字符,而不存在的letra[1]
保存null终止符。这是一个写越界,调用了所谓的未定义行为。从技术上讲,任何事情都可能发生。
似乎正在发生的是,letra[1]
恰好与palavra[0]
在内存中的位置相同,因此'b'
被一个空字符覆盖。
解决方案:
char chave[50], palavra[50], letra;
以及后来的
if(chave[i] == letra){
palavra[i] = letra;
acerto=true;
}
让角色成为单个角色。
好吧,考虑到你正在努力学习,而且你不受任何典型家庭作业规则的限制,你可以按照以下第一步正确做事。
首先:将这些CCD_ 9替换为CCD_ 10s。在c++中,您已经构建了可以做各种事情的类,管理字符串就是其中之一,letra
1就是其中之一。
第二:letter
实际上是一个单独的字母,所以它不需要是char[1]
,也可以只是char
。
第三:试着用英语写变量,当你要共享代码时,对任何人来说都更容易。
从这些简单的步骤开始,您将编写更好的代码,这些代码将顺便帮助您避免错误。
附言:我不会把你的代码放在一个有效的和改进的版本里,因为我认为你自己做会学到更多,而不是从这里复制一些代码。