26

No idea what's going on. I looked at other posts that are similar to this issue but no solution helped so far. Here's the code with comments by the parts giving errors. At one point it says that != doesn't work and in the rest of the code it's saying that << isn't working.

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

using namespace std;
//Hangman

int main()
{
    //setup
    vector<string> words;
    words.push_back("GUITAR");
    words.push_back("VIRGINIA");
    words.push_back("LAPTOP");
    words.push_back("WIFEY");
    words.push_back("IPHONE");

    srand(static_cast<unsigned int>(time(0)));   //randomly select a word
    random_shuffle(words.begin(), words.end());
    const string THE_WORD = words[0];
    const int MAX_WRONG = 8;                    //initialize wrong guesses
    int wrong = 0;
    string soFar(THE_WORD.size(), '-');         //initalize the word so far with dashes
    string used = " ";                          //initalize letters used


    cout << "Welcome to Hangman. Good luck!/n";

    //game loop
    //continues until a player guesses the word or gets too many wrong guesses
    while ((wrong < MAX_WRONG) && (soFar != THE_WORD)) //ERROR on the "!="
    {
        cout << "\n\nYou have " << (MAX_WRONG - wrong) << " incorrect guesses left.\n";
        cout << "\nYou've used the following letters:\n" << used << endl; //ERROR on "<<" between the string and used
        cout << "\nSo far, the word is:\n" << soFar << endl; //ERROR on "<<" between the string and soFar

    //recieve the player's guess
        char guess;
        cout << "\n\nEnter your guess: ";
        cin >> guess;
        guess = toupper(guess); //makes the guess uppercase since the secret word is uppercase
        while (used.find(guess) != string::npos)
        {
            cout << "\nYou've already guessed " << guess << endl;
            cout << "Enter your guess: ";
            cin >> guess;
            guess = toupper(guess);
        }

        used += guess;

        if (THE_WORD.find(guess) != string::npos)
        {
            cout << "That's right! " << guess << " is in the word.\n";

            //updated soFar to include newly guessed letter
            for (int i=0; i < THE_WORD.length(); ++i)
            {
                if (THE_WORD[i] == guess)
                {
                    soFar[i] = guess;
                }
            }
        }
        else
        {
            cout << "Sorry, " << guess << " isn't in the word.\n";
            ++wrong;
        }
    }
    //shut down
    if (wrong == MAX_WRONG)
    {
        cout << "\nYou've been hanged!";
    }
    else
    {
        cout << "\nYou guessed it!";
    }

    cout << "\nThe word was " << THE_WORD << endl; //ERROR on "<<" between the string and THE_WORD


    int pause;
    cin >> pause; //this is here just so my compiler will stay open so I can see what's going on
    return 0;
}
Casey
  • 41,449
  • 7
  • 95
  • 125
Evan Lemmons
  • 807
  • 3
  • 11
  • 27

3 Answers3

66

If you want to use std::string reliably, you must #include <string>.

juanchopanza
  • 223,364
  • 34
  • 402
  • 480
10

You're not including the standard <string> header.

You got [un]lucky that some of its pertinent definitions were accidentally made available by the other standard headers that you did include ... but operator<< was not.

Community
  • 1
  • 1
Lightness Races in Orbit
  • 378,754
  • 76
  • 643
  • 1,055
-1

It looks like you're comparing strings incorrectly. To compare a string to another, use the std::string::compare function.

Example

     while ((wrong < MAX_WRONG) && (soFar.compare(THE_WORD) != 0)) 
Brett
  • 159
  • 1
  • 8
  • 4
    No. There is an overload of `!=` for `std::string` that does the right thing, and is the idiomatic way to do it in C++. – Alan Stokes Jan 05 '14 at 21:07
  • 1
    Oh, thank you. I honestly didn't know. As I started with C, I've been doing this for a few years. I checked the reference documents and never noticed the overload; needless to say, I'm a tad ashamed. – Brett Jan 05 '14 at 21:08
  • 1
    No shame involved. Overloading != and == is just the normal way to handle this in C++; it would be odd for a class to support equality any other way. – Alan Stokes Jan 05 '14 at 21:11
  • 3
    That comment is `MAX_USELESS`. The ratings and comment by Alan were sufficient enough; there's no need to be derogatory. – Brett Jan 12 '14 at 16:39