C++ C++&书信电报;算法>;替换所有不工作的引用

C++ C++&书信电报;算法>;替换所有不工作的引用,c++,string,algorithm,replace,C++,String,Algorithm,Replace,我试图用C++(11)制作一个简单的猜字游戏,因为它需要向玩家显示一个“隐藏单词”,所以我制作了两个字符串;第一个是可见的“test”,另一个只是用下划线“\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu”。我用string::iterator做了一个循环,将字符串中的每个字符与用户输入的给定(char)进行比较 这里的问题是,在我第一次输入“t”时,它并没有替换字符串中的所有匹配项,这将导致“t\uuu

我试图用C++(11)制作一个简单的猜字游戏,因为它需要向玩家显示一个
“隐藏单词”
,所以我制作了两个字符串;第一个是可见的
“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;
}