C++ C++&书信电报;算法>;替换所有不工作的引用
我试图用C++(11)制作一个简单的猜字游戏,因为它需要向玩家显示一个C++ C++&书信电报;算法>;替换所有不工作的引用,c++,string,algorithm,replace,C++,String,Algorithm,Replace,我试图用C++(11)制作一个简单的猜字游戏,因为它需要向玩家显示一个“隐藏单词”,所以我制作了两个字符串;第一个是可见的“test”,另一个只是用下划线“\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu”。我用string::iterator做了一个循环,将字符串中的每个字符与用户输入的给定(char)进行比较 这里的问题是,在我第一次输入“t”时,它并没有替换字符串中的所有匹配项,这将导致“t\uuu
“隐藏单词”
,所以我制作了两个字符串;第一个是可见的“test”
,另一个只是用下划线“\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu”
。我用string::iterator
做了一个循环,将字符串中的每个字符与用户输入的给定(char
)进行比较
这里的问题是,在我第一次输入“t
”时,它并没有替换字符串中的所有匹配项,这将导致“t\uuu t
”而不是“t\uu
”
对于该过程,我正在使用
标题中的replace
功能
看起来是这样的:replace(str.begin(), str.end(), str.at(char_idx), newLetter);
这个函数在一个for循环中,循环遍历字符串;在另一个名为
checkLetter()的函数中
但是当我运行一个更简单的版本时,比如string RandomWord = "test";
replace(RandomWord.begin(),RandomWord.end(),'t','S');
cout << RandomWord << endl;
如果我理解正确的话,你基本上是想把一个字符串转换成另一个字符串 使用的双输入迭代器重载应该是您需要的函数。第一个输入容器可以是包含要替换的下划线的字符串,而第二个输入容器是包含实际单词的字符串。然后使用输入字母作为状态或捕获提供一个函子或lambda,并让函数返回第一个容器中的当前字母(屏蔽字),除非该字母与第二个容器中的当前字母(要猜测的字)匹配。输出迭代器是屏蔽字(与第一个输入迭代器相同) 可能类似于此示例程序的内容显示:
#include <iostream>
#include <string>
#include <algorithm>
int main()
{
std::string word = "foobar"; // The word to guess
std::string masked = "______"; // The masked word, that will be unmasked letter by letter
// "Guess" some letters...
for (auto const letter : { 'f', 'a', 'x', 'o', 'y', 'r', 'b' })
{
std::cout << "Before '" << letter << "': \"" << masked << "\"\n";
// Convert the masked word into a less masked word
// But only if the letter is found in the word to guess
std::transform(std::begin(masked), std::end(masked), std::begin(word),
std::begin(masked),
[letter](char const& masked_letter, char const& word_letter)
{
if (letter == word_letter)
return word_letter;
else
return masked_letter;
});
std::cout << "After '" << letter << "': \"" << masked << "\"\n";
}
}
#包括
#包括
#包括。如果我理解正确,您基本上想将一个字符串转换成另一个字符串
使用的双输入迭代器重载应该是您需要的函数。第一个输入容器可以是包含要替换的下划线的字符串,而第二个输入容器是包含实际单词的字符串。然后使用输入字母作为状态或捕获提供一个函子或lambda,并让函数返回第一个容器中的当前字母(屏蔽字),除非该字母与第二个容器中的当前字母(要猜测的字)匹配。输出迭代器是屏蔽字(与第一个输入迭代器相同)
可能类似于此示例程序的内容显示:
#include <iostream>
#include <string>
#include <algorithm>
int main()
{
std::string word = "foobar"; // The word to guess
std::string masked = "______"; // The masked word, that will be unmasked letter by letter
// "Guess" some letters...
for (auto const letter : { 'f', 'a', 'x', 'o', 'y', 'r', 'b' })
{
std::cout << "Before '" << letter << "': \"" << masked << "\"\n";
// Convert the masked word into a less masked word
// But only if the letter is found in the word to guess
std::transform(std::begin(masked), std::end(masked), std::begin(word),
std::begin(masked),
[letter](char const& masked_letter, char const& word_letter)
{
if (letter == word_letter)
return word_letter;
else
return masked_letter;
});
std::cout << "After '" << letter << "': \"" << masked << "\"\n";
}
}
#包括
#包括
#include.如果基于您的代码,则不应使用std::replace,因为第三个参数(表示字母替换)在文本中可能出现两次。所以你可以像下面这样替换字母
void checkLetter(char &newLetter, string &randstr, int &strlen, string &hiddenWord){
string::iterator it;
for(auto it = randstr.begin(); it != randstr.end();++it){
if(*it == newLetter){
hiddenWord.at(it - randstr.begin()) = newLetter;
}
}
cout << hiddenWord << endl;
}
void checkLetter(char和newLetter、string和randstr、int和strlen、string和hiddenWord){
字符串::迭代器;
for(auto-it=randstr.begin();it!=randstr.end();+it){
如果(*it==新字母){
hiddenWord.at(it-randstr.begin())=newLetter;
}
}
cout如果基于您的代码,您不应该使用std::replace,因为第三个参数(表示从字母中替换)可以在文本中出现两次。因此,您可以按如下方式替换字母
void checkLetter(char &newLetter, string &randstr, int &strlen, string &hiddenWord){
string::iterator it;
for(auto it = randstr.begin(); it != randstr.end();++it){
if(*it == newLetter){
hiddenWord.at(it - randstr.begin()) = newLetter;
}
}
cout << hiddenWord << endl;
}
void checkLetter(char和newLetter、string和randstr、int和strlen、string和hiddenWord){
字符串::迭代器;
for(auto-it=randstr.begin();it!=randstr.end();+it){
如果(*it==新字母){
hiddenWord.at(it-randstr.begin())=newLetter;
}
}
cout alot mate:)谢谢alot mate:)循环范围内的auto
类型是什么?@6eqj5应该是char
。哦,等等,问错了。我指的是{…}类型
在循环范围内。好吧,我现在知道了。std::initializer\u list
在循环范围内的auto
类型是什么?@6eqj5应该是char
。哦,等等,问错了。我是指循环范围内的{…}
类型。好吧,我现在知道了。std::initializer\u list
void checkLetter(char &newLetter, string &randstr, int &strlen, string &hiddenWord){
string::iterator it;
for(auto it = randstr.begin(); it != randstr.end();++it){
if(*it == newLetter){
hiddenWord.at(it - randstr.begin()) = newLetter;
}
}
cout << hiddenWord << endl;
}