如何将char变量添加到字符串中? 我把一个刽子手游戏作为第一个C++项目,我需要保存一个玩家已经使用过的所有字母的库。在玩家猜到一个字母后,我需要将其添加到guessed库中。猜测是全局定义的char变量,猜测的变量也是如此。我试着这样做: #包括 #包括 使用名称空间std; 猜字符; 猜猜绳子; int main(){ cin>>猜测; 猜测->推回(猜测); }

如何将char变量添加到字符串中? 我把一个刽子手游戏作为第一个C++项目,我需要保存一个玩家已经使用过的所有字母的库。在玩家猜到一个字母后,我需要将其添加到guessed库中。猜测是全局定义的char变量,猜测的变量也是如此。我试着这样做: #包括 #包括 使用名称空间std; 猜字符; 猜猜绳子; int main(){ cin>>猜测; 猜测->推回(猜测); },c++,string,char,C++,String,Char,然而,这不起作用。我还尝试过使用+=操作符,但出现了一个错误 error: incompatible types in assignment of 'char' to 'std::__cxx11::string [0]' {aka 'std::__cxx11::basic_string<char> [0]'} 错误:将“char”赋值给“std::u cxx11::string[0]”时存在不兼容的类型{aka 'std::_cxx11::基本_字符串[0]” 我猜测我的变量类型有问题,

然而,这不起作用。我还尝试过使用
+=
操作符,但出现了一个错误

error: incompatible types in assignment of 'char' to 'std::__cxx11::string [0]' {aka 'std::__cxx11::basic_string<char> [0]'} 错误:将“char”赋值给“std::u cxx11::string[0]”时存在不兼容的类型{aka 'std::_cxx11::基本_字符串[0]”

我猜测我的变量类型有问题,但是这是我的第一个C++项目,我不能准确地解决这个问题。

< P>你认为我的最佳选择是使用<代码> STD::SET> char > < />代码。 这将不包含重复项,并在O(logn)时间内返回答案

或者实际上因为它的范围很小,所以实际上可以使用长度为26的二进制数组

例如,根据您的要求:

#include <iostream>
#include <string>
#include <set>

int main()
{
  char guess;
  std::set<char> lettersBank;
  std::cout << "Plz enter your letter guess:";
  std::cin >> guess;
  lettersBank.insert(guess);
  
  // check if some letter is already inside the set:
  char checkLetter = 'd';
  if(lettersBank.find(checkLetter) != lettersBank.end())
    std::cout << "you already guessed this letter" << std::endl;
}
#包括
#包括
#包括
int main()
{
猜字符;
std::设置信笺银行;
std::cout>猜测;
信笺银行。插入(猜测);
//检查集合中是否已存在某些字母:
字符校验字母='d';
if(lettersBank.find(checkLetter)!=lettersBank.end())

std::cout我认为与其使用大量字符,不如将它们保留在索引0-25处

您可以创建一个包含26个
bool
s的数组。如果用户输入
a
,则相应的
bool
,或索引
0
将设置为
true
。代码如下:

#include <iostream>
#include <array>
#include <cctype> // for std::toupper(char c)

int main()
{
    char guess;
    std::array<bool, 26> guessed;
    std::cout << "Take a guess!\n";
    std::cin >> guess;
    guess = std::toupper(guess); // Make it to uppercase so you don't need to check the case
    if(guessed[guess - 'A'])
    {
        std::cout << "You already guessed it!\n";
    }
    else
    {
        guessed[guess - 'A'] = true;
    }
}

就游戏性而言,它按字母顺序打印字母,而不是按时间顺序打印字母,我认为这更容易找到您尚未猜到的字母。

不会猜到。
推后(猜)
语法正确吗?编译正确吗?
猜测->
应该会生成错误,因为
std::string
不是指针,
运算符->
用于指针。
字符串[0]
?有些东西不正确。显示一个真实的字符。现在
字符[0]
?这不是您正在测试的真实代码!!再次提出。旁注:避免使用全局变量。它们不能很好地扩展。随着程序变得越来越复杂,很难跟踪谁更改了全局变量、原因和时间。任何函数都可以随时更改值,因此可能会在任何地方潜伏错误。但是如果您通过va变量作为一个参数,你有一个更清晰的路径和更简单的调试。我不太清楚你的意思。你能给我一个代码中的例子吗?再看看
std::unordered\u set
。对于像
char
这样简单的东西,查找将非常接近O(1)事实上,对于小型数据集(请记住,这可能是最多26个元素),集合(尤其是无序的集合)的好处并不值得所有的间接和树(或桶)管理。在26个元素
char
数组中的线性搜索绝对是微不足道的。不过,我会告诉你,它是最自我记录的代码(可能是我会使用的,除非我正在调整!)Asteroid是对的。缓存和CPU的预测和处理能力意味着阵列方法的O(N)时间复杂度几乎肯定会比使用更智能的算法所能做的任何事情都要快,直到你进入数百或数千个元素。这非常有效。我相信@Nissim Levy建议了这一点,但感谢你的例子。不过有一件事?如果我只想使用小写字母,我会怎么做?换句话说,这些mec会怎么做汉语不使用
toupper()
函数就可以工作?另外,你把touper拼写错了:
guess=std::topper(guess);
你说得对,我把它拼写错了。还有
std::tolower
的工作原理基本相同,只是你把
guessed[guess-'A']
改为
guessed>[guess-'a']
。我之所以要将
toupper
tolower
包括在内,是因为你不知道用户是否会猜
a
,然后出于某种原因决定猜
a
。你可能还想把它们放在
if(std::isalpha(guess))中
检查他们是否猜到了字母。是的,如果这是非常正式的,那就有意义了,不过我只是为了好玩。
    for(int i = 0; i < guessed.size(); ++i)
    {
        if(guessed[i])
        {
            std::cout << static_cast<char>(i + 'A') << ", ";
        }
    }