c++ - 如何找到重复项
问题描述
/* 我已经根据给出的指令编写了一个简单的刽子手的代码,我只想知道如何检测重复的输入。对于此代码,它只检测正确的字母和长度
例如:
用户输入: HAM H A HANGMAN!*/
#include <iostream>
#include <cstring>
using namespace std;
int main()
{
// Word to be guessed can be assumed to be at most 20 characters long (including end-of-string null character)
char HangmanWord[20];
// Variable to store current guess
char GuessLetter;
int count = 0;
std::cin >> HangmanWord;
//char guessedletter[strlen(HangmanWord)];
//int j = 0;
bool valid = true;
// Check that input word only consists of uppercase English letters
for (int i = 0; i < strlen(HangmanWord); i++)
{
if ((HangmanWord[i] > 'Z') || (HangmanWord[i] < 'A'))
{
valid = false;
break;
}
}
while (valid == true)
{
std::cin >> GuessLetter; //Takes the Guess letter
if ((GuessLetter > 'Z') || (GuessLetter < 'A')) //Check that guessed letter is uppercase
{
break;
}
else
{
for (int i = 0; i < strlen(HangmanWord); i++) //loop to check every letter in word
{
if (GuessLetter == HangmanWord[i]) { //if the letter is equal to any letter in the word the count increases
count++;
break;
}
if (i == strlen(HangmanWord) - 1) { //If no letter is equal to any letter in the word the program exits
valid = false;
}
}
if (count == strlen(HangmanWord)) { //Checks if all letters were guessed and exits the loop after
valid = false;
}
}
}
if (count == strlen(HangmanWord)) { //Checks if all letters were guessed correct to print Hangman
cout << "HANGMAN!\n";
valid = false;
}
解决方案
如果要检测是否已经输入了字母,可以使用由数字表示的 ASCII 字符。假设我们将自己限制为大写字母,'A'
是 65,而“Z”是 90。
我们可以用这些来做数学。 'A' - 'A'
是0
和'C' - 'A'
是2
。
我们也知道数组是从零开始索引的。
我们可以将这些东西放在一起创建一个布尔值数组,并将它们标记为猜测字母。
std::array<std::bool, 26> already_guessed;
std::fill(already_guess.begin(), already_guessed.end(), false);
然后我们可以通过查找来检查是否已经猜到了一个字母。例如,考虑检查是否'D'
已被猜到。他们一开始应该是假的,因为一开始什么都没有猜到。
already_guessed['D' - 'A']
如果没有,我们可以将其标记为已猜到:
already_guessed['D' - 'A'] = true
推荐阅读
- c++ - 在回调中使用函数时 C++ 未知覆盖说明符
- node.js - NPM 在命令提示符下挂起,但在 powershell 上工作
- angular - 在 TypeScript 中复制 JS 的 nextUntil
- python - 在 gtk for vlc 中实现搜索器的最佳方法
- c# - C# 将 json 序列化为类
- android - 从另一个 Fragment 在 Fragment 的选项卡视图中设置选项卡位置
- php - Laravel 登录后将用户重定向到原始目的地
- r - 两个样本(不等方差)韦尔奇 t 检验的统计功效和样本量确定?
- azure - Verizon 的 Azure CDN 目前不支持 CDN 和源之间的自动 SNI 解析
- python - Heroku 在一个测功机中运行两个工人