2015-03-16 3 views
3

Я пытаюсь написать программу, которая имитирует игру Hangman.Замена текста в строке дефисом

#include <iostream> 
#include <string> 
#include "assn.h" 

using namespace std; 

int main(){ 
    clearScreen(); 
    cout << "Enter a word or phrase: "; 
    string phrase; 
    std::getline(std::cin, phrase); 
    cout << endl << "Your phrase: " << phrase << endl; 
    cout << endl; 
} 

В настоящее время я могу получить строку ввода и сохранения пространства, но я хочу, чтобы создать еще одну строку, в которой все буквы заменяются дефисами и пробелы сохранены. Я пробовал искать его и не мог понять, как это сделать.

+2

C++ есть много хороших [алгоритмов стандартной библиотеки] (http://en.cppreference.com/w/cpp/algorithm), например, один для [заменить значения] (HTTP: // ru.cppreference.com/w/cpp/algorithm/replace) (или [заменить при копировании] (http://en.cppreference.com/w/cpp/algorithm/replace_copy)). –

ответ

2

Вот пример использования algorithm «s replace_if

#include <iostream> 
#include <string> 
#include <algorithm> 

int main() 
{ 
    using namespace std; 

    string input{"This is a test"}; 
    string censored{input}; 
    replace_if(censored.begin(), censored.end(), ::isalpha, '-'); 
    cout << censored << std::endl; 
} 

Выход:

---- -- - ---- 

выше вызов replace_if итерацию над контейнером (в данном случае, строка символов) и заменяет алфавитных с тире, оставив места нетронутыми.

Live example

+0

Большое вам спасибо, что это работает очень хорошо! Теперь мне просто нужно выяснить, как заменить тире угаданными буквами. – Enddate

2

Ниже приведен пример этого вручную. Я сохранил вашу исходную строку, чтобы вы могли начать заменять буквы, когда они догадываются о них. Я нахожу, что вначале хорошо делать что-то, а затем использовать алгоритм, чтобы понять, что происходит за кулисами.

#include <iostream> 
    #include <string> 

    using namespace std; 

    int main() 

    { 
     cout << "Enter a word or phrase: "; 

     string originalPhrase; 

     std::getline(std::cin, originalPhrase); 

     // Copy the original string 
     string newPhrase(originalPhrase); 
     int phraseSize = originalPhrase.size(); 
     for(int i = 0; i < phraseSize; ++i) 
     { 
      // Replace each character of the string with _ 
      newPhrase[i] = '_'; 
     } 

     cout << endl << "Your phrase: " << originalPhrase << endl; 
     cout << endl << "Your new phrase: " << newPhrase << endl; 

     cout << endl; 
    } 
+1

'std :: string' также имеет конструктор заполнения, который принимает size_t и символ. Это даст вам тот же результат, что и ваш for-loop: 'string newPhrase (originalPhrase.length(), '_');' – Julian

+0

Я не знал этого, очень круто! – marsh

3

Вы можете использовать эту функцию, которая возвращает hyphened строку вашей фразы строки:

std::string replacetohyphen(std::string phrase){ 
    for(int i=0;i<(int)phrase.length();i++){ 
    phrase[i]='-';} 
    return phrase;} 

использование: new_phrase=replacetohyphen(phrase);

если вы хотите сохранить пробелы в этой новой hyphened строки тоже, то простое условие внутри цикла for будет делать трюк:

std::string replacetohyphen(std::string phrase){ 
    for(int i=0;i<(int)phrase.length();i++){ 
    if(phrase[i]!=' ')phrase[i]='-';} 
    return phrase;} 
+0

Это не будет сохранять пробелы - хотя ОП не указал, требуется ли это. – Julian

+0

Да, хотя я добавил эту возможность сейчас ... – Jahid

Смежные вопросы