2014-02-18 2 views
0

Я работал над игрой Hangman в Cpp ... Итак, я создал переменную с именем SoFar, которая хранит тире в начале, но постепенно раскрывается.Строка не печатается/инициализируется должным образом

for(i = 0; i <= TheWord.length(); i++) 
      SoFar[i] = '-'; 

Итак, я (попробуйте) инициализировать SoFar содержать черточки в начальной, и быть такой же длины, как TheWord

Позже, когда я печатаю ГНФАР, это просто пустой!

cout << "\nSo far, the word is : " << SoFar << endl; 

Picture showing output

Любые и все советы оценили. Вот моя полная программа, для справки:

#include <iostream> 
#include <cstdlib> 
#include <string> 
#include <vector> 
#include <ctime> 
#include <cctype> 

using namespace std; 

int main() 
{ 

    vector<string> words; 
    words.push_back("SHAWARMA"); 
    words.push_back("PSUEDOCODE"); 
    words.push_back("BIRYANI"); 
    words.push_back("TROLLED"); 
    srand((unsigned)time(NULL)); 
    string TheWord = words[(rand() % words.size()) + 1]; 
    string SoFar;   
    const int MAXTRIES = 8; 
    string used = ""; 
    int tries, i; 
    i = tries = 0; 
    char guess; 
     for(i = 0; i <= TheWord.length(); i++) 
      SoFar[i] = '-'; 

    while(tries <= MAXTRIES && SoFar != TheWord) 
    { 
     /****************************************************************/ 
     /*       I/0         */ 
     /****************************************************************/ 
     cout << "\nYou haz " << MAXTRIES - tries << " tries to go!\n" ; 
     cout << "You've used the following letters : "; 

     for(i = 0; i <= used.length(); i++) 
      cout << used[i] << " : " ; 

     cout << "\nSo far, the word is : " << SoFar << endl; 
     cout << "\nEnter your guess : " ; 
     cin >> guess; 
     /****************************************************************/ 
     /*       Processing input     */ 
     /****************************************************************/ 
     if(used.find(guess) != string::npos) 
      continue; 
     guess = toupper(guess); 
     if(TheWord.find(guess) != string::npos) 
     { 
      for(i = 0; i <= TheWord.length(); i++) 
      { 
       if(guess == TheWord[i]) 
        SoFar[i] = guess; 
      } 

     } 
     else 
     { 
      cout << "\nSorry, but the word doesn't have a letter like " << guess << " in it...\n"; 
      tries++; 
     } 
       used += guess; 

    } 

    if(tries == MAXTRIES) 
     cout << "\nYep, you've been hanged...\n"; 
    else if(SoFar == TheWord) 
     cout << "\nYou got it! Congratulations...\n(Now Im gonna add some psuedorandomly generated words just for you <3 :P)"; 

    cout << "\nThe word was : " << TheWord; 

    return 0; 
} 

ответ

2

SoFar определяются как:

string SoFar;   

... тогда вы пытаетесь писать:

for(i = 0; i <= TheWord.length(); i++) 
     SoFar[i] = '-'; 

Когда вы пишете ему, SoFar еще имеет длину 0, поэтому каждый время, которое вы выполняете SoFar[i] = '-';, вы получаете неопределенное поведение.

Try:

std::string SoFar(TheWord.length(), '-'); 

SoFar Это определяет, уже содержащий нужное количество черточек.

Вот краткий демо:

#include <string> 
#include <iostream> 

int main(){ 
    std::string TheWord{"TROLLED"}; 

    std::string SoFar(TheWord.length(), '-'); 

    std::cout << TheWord << "\n"; 
    std::cout << SoFar << "\n"; 
} 

По крайней мере, для меня, это, кажется, производит правильную длину результата:

TROLLED 
------- 
2

Вы пытаетесь изменить объекты, которые не существуют:

string SoFar;   
const int MAXTRIES = 8; 
string used = ""; 
int tries, i; 
i = tries = 0; 
char guess; 
    for(i = 0; i <= TheWord.length(); i++) 
     SoFar[i] = '-'; 

SoFar Так пусто, пытается изменить SoFar[i] это неопределенное поведение.

+0

Что вы предлагаете мне делать? –

+0

Используйте конструктор заполнения, 'string (size_t n, char c);'. –

1

вы указали, что ГНФАР в виде строки, так попытайтесь использовать двойной котировки для стоимости

for(i = 0; i <= TheWord.length(); i++) 
SoFar[i] = "-"; 
Смежные вопросы