为什么只有索引 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;
}
让字符为单个字符。
我会直接
上下文:我正在制作刽子手游戏
脚本“错误”区域:
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;
}
让字符为单个字符。