C ++ - 用字符替换“_”

时间:2014-03-07 10:28:45

标签: c++ arrays replace

使用C ++,我试图让一个刽子手游戏变得更好地使用C ++和编程。无论如何,我面临的问题是我不知道如何用字母用户猜到的字母替换字符串中的破折号。

我认为我的问题在于选择的单词是从数组中随机选择的,我不知道如何在随机选择的字符串中找到由猜测字符组成的位置。

我已经评论了造成这个问题的区域。

#include <iostream>
#include <array>
#include <string>
#include <stdlib.h>
#include <time.h>
#include <cstddef>
#include <algorithm>

using namespace std;

int main()
{
    string words[3] = {"stack", "visual", "windows"};
    string guess;

    cout << "Welcome to hangman.\n";
    cout << "\n";

    srand(time(NULL));

    int RandIndex = rand() % 3;
    string selected = words[RandIndex];

    for (int i = 1; i <= selected.size(); i++) {
        cout << "_ ";
    }

    cout << "\n";
    cout << "\nType in a letter: ";
    cin >> guess;
    cout << "\n";

    if (selected.find(guess) != string::npos) {
        /*for (int i = 1; i <= selected.size(); i++) {
            if (selected.find(guess) != string::npos) {
                cout << "_ ";
            } else {
                cout << guess << " ";
            }
        }*/
    } else {
        cout << "\nNay!\n";
        cout << "\n";
    }

    cout << "\n";
    cout << "\n";

    system("PAUSE");
    return 0;
}

我正在考虑使用replace()函数,但我在这里遇到的问题是我没有替换selected变量中的字符串,而是迭代单词本身,如果这样做的话感觉到什么?

5 个答案:

答案 0 :(得分:2)

使用第二个字符串,使用下划线初始化。如果find函数返回string::npos,它将返回字符串中的位置,这也是您应该在带有下划线的字符串中更改的位置。

答案 1 :(得分:1)

您实际上需要使用第二个字符串来存储“猜到的”字符串;这是因为您需要跟踪所有猜到的字母并显示它们。

类似的东西:

    string s ="test";
    string t="";  //empty string

    for(int i=0;i<s.size();i++)
        t.append("_");    //initialize the guess string
    cout<<t<<'\n'; 

    char c;
    cin >> c;

    int pos = s.find(c);   //get the first occurrence of the entered char
    while(pos!=-1)         //look for all occurrences and replaced them in the guess string
    {
      t.replace(pos,1,1,c);   
      pos = s.find(c, pos+1);

    }

答案 2 :(得分:0)

我认为你需要在循环时保持一些额外的状态 - 以跟踪哪些字母已被/不被猜到。

您可以添加一个新字符串current_state,该字符串最初设置为与单词相同的长度,但是所有下划线。然后,当玩家猜出一个字母时,你会在原始单词中找到该字母的所有实例,并在所有找到但位于current_state的位置替换下划线和猜到的字母。

答案 3 :(得分:0)

首先,我会初始化一个新字符串以显示隐藏的字词:

string  stringToDisplay = string(  selected.length(), '_');

然后对于用户给出的每个字母,我会像这样循环: (假设猜是字母)

size_t searchInitPos = 0;
size_t found = selected.find(guess, searchInitPos));
if (found == string::npos)  
{
    cout << "\nNay!\n";
            cout << "\n";
}
while( found != string::npos)
{
    stringToDisplay[found] = guess;
    searchInitPos = found+1;
    found = selected.find(guess, searchInitPos));
}
cout << stringToDisplay;

希望这会有所帮助

答案 4 :(得分:-1)

我认为应该是这样的:

string words[3] = {"stack", "visual", "windows"};
char guess;
string display;

cout << "Welcome to hangman.\n";
cout << "\n";

srand(time(NULL));

int RandIndex = rand() % 3;
string selected = words[RandIndex];

for (int i = 0; i < selected.size(); i++) {
    display.insert(0, "_ ");
}
cout << display;

while(display.find("_ ") != string::npos) {
    cout << "\n";
    cout << "\nType in a letter: ";
    cin >> guess;
    cout << "\n";

    bool flag = false;
    for (int i = 0; i < selected.size(); i++) {
        if (selected[i] == guess) {
            display.replace(i*2, 1, 1, guess);
            flag = true;
        }
    }
    if (!flag) {
        cout << "\nNay!\n";
        cout << "\n";
    } else {
        cout << display;
    }

}