subscript out of range

HELLO
everyone
i m trying to design a program likes hangman
the errors is string subscript out of range

[sub][sub]
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
/*  Program:     Hangman game as project 4

Description: Implement a variation of the classic word game Hangman.

I certify that the code below is my own work.

Exception(s): N/A

*/

#include <iostream>
#include <fstream>
#include <string>
#include <ctime>
#include <cstdlib>

using namespace std;

const int MAX_NUMS = 200;   // Constant for the maximum number of words.
const int MAX_GUESSES = 8;
const string LETTERS = "abcdefghijklmnopqrstuvwxyz";

char   inputLetter();
int    findChar(char letter, string&word);
string getGuessedWord(string&secretWord, string&lettersGuessed);
string getLettersGuessed(char letter, string&lettersGuessed, int n);
void display(string&lettersGuessed, string&wordGuessed, int num, int pos);
bool isDone(string wordGuessed);

int main()
{
	string oneWord;					// holds one word from input file
	string secretWord;				// holds secret word to be guessed
	string words[MAX_NUMS];			// holds list of words from input file
	int randomValue;				// holds index of secret word
	int count = 0;					// holds number of words in the file

	// Declare an ifstream object named myFile and open an input file
	ifstream myFile;
	myFile.open("P4Words.txt");

	// Exit program if cannot open file for input
	if (!myFile)
	{
		cout << "Error: Unable to open file for input" << endl;
		return 0;
	}

	// Input words from a file into words array
	// Add your code here ...
	myFile >> oneWord;
	while (!myFile.eof())
	{
		words[count] = oneWord;
		count++;
		myFile >> oneWord;
	}
	myFile.close();
	cout << count << " words loaded." << endl;

	srand(static_cast<unsigned int>(time(0)));

	// Select a secret word
	// Add your code here ...
	secretWord = words[rand() % (count - 0 + 1) + 0];

	// Possible useful variables the loop
	string lettersGuessed = "";	// holds letters guessed so far
	string wordGuessed;			// holds current word guessed like �_ pp_ e�
	int incorrectGuesses = 0;	// holds number of incorrect guesses so far
	char letter;				// holds a guessed letter
	bool done = false;			// have not guessed the word yet
	int num = 8; int pos;
	cout << "Welcome to the game, Hangman V1 by Your Name!" << endl;
	cout << "I am thinking of a word that is " << secretWord.length()
		<< " letters long." << endl;

	// Set up a loop to input guesses and process
	// Add your code here ...
	do
	{
		letter = inputLetter();
		pos = findChar(letter, secretWord);
		wordGuessed = letter;
		lettersGuessed = getLettersGuessed(letter, lettersGuessed, 8 - num);
		wordGuessed = getGuessedWord(secretWord, lettersGuessed);
		display(lettersGuessed, wordGuessed, num, pos);
		done = isDone(wordGuessed);
		num--;

	} while ((num > 1) && (done == false));


	// Check for won or lost
	// Add your code here ...
	if (done==false)
	{
		cout << "sorry you lose..." << endl;
	}
	if (done == true)
	{
		cout << "congrualte! " << endl;
	}

	system("pause");	// stop program from closing, Windows OS only

	return 0;
}

// Add function definitions here ...
char   inputLetter()
{
	int i;
	char letter;

	do
	{
		cout << "please guess a letter: " << endl;
		cin >> letter;

		for ( i = 0; i < 25; i++)
		{
			if (letter == LETTERS[i])
			{
				return letter;
			}
		}

		if (letter != LETTERS[i])
		{
			cout << "Oops! That is an invalid character." << endl;
		}
	} while (letter != LETTERS[i]);

}

int findChar(char letter, string&word)
{
	int i = 0;	int pos = 0; bool found = false;
	do
	{
		if (word[pos] == letter)
		{
			return pos;
			found = true;
		}
		pos++;

	} while (pos<word.length() - 1);

	if (found == false)
	{
		return -1;
	}


}
string getGuessedWord(string&secretWord, string&letterGuessed)
{
	string temp;
	temp = secretWord;
	
	for (size_t k = 0; k <= temp.length() - 1; k++)
	{
		temp[k] = '_';
	}
	for (size_t i = 0; i <= temp.length() - 1; i++)
	{
		for (size_t j = 0; j <= temp.length() - 1; j++)
		{
			if (letterGuessed[i] == secretWord[j])
			{
				temp[j] = letterGuessed[i];
			}
		}

	}



	return temp;
}
string getLettersGuessed(char letter, string&lettersGuessed, int n)
{

	string temp;
	temp = letter;
	lettersGuessed.insert(n, temp);
	return lettersGuessed;

}

void display(string&lettersGuessed, string&wordGuessed, int num, int pos)
{
	if (pos != -1)
	{
		cout << "You have " << num << " guesses left." << endl;
		cout << "Letters guessed so far: " << lettersGuessed << endl;
		cout << "Good guess!: " << wordGuessed << endl;
		cout << "-----------------------------------------------------" << endl;
	}
	if (pos == -1)
	{
		cout << "You have " << num << " guesses left." << endl;
		cout << "Letters guessed so far: " << lettersGuessed << endl;
		cout << "Oops! that letter is not my word: " << wordGuessed << endl;
		cout << "-----------------------------------------------------" << endl;
	}

}

bool isDone(string wordGuessed)
{
	bool done = false; int k = 0;
	for (size_t i = 0; i <= wordGuessed.length() - 1; i++)
	{
		if (wordGuessed[i] == '_')
		{
			k++;
		}
	}

	if (k == 0)
	{
		done = true;

	}
	return done;
}

[sub]
Last edited on
Hi,

If you have compiler errors then post them here in full.

THen when can have an idea of what is going on.

Cheers
Line 54 has the potential to access outside the bounds of words and, as a result, line 65 also has the potential to access outside the bounds of words.

If line 129 is reached, i will not be a valid index for LETTERS.

Line 145 cannot be reached.

Line 151 will never evaluate to false.







Topic archived. No new replies allowed.