Reusing a string?

What's up CPP Forum! It's been a couple years since I have been here. Just stopped by to see if anyone could help me out. I've already Googled it and tried several things and none of them have worked.

What I've tried:
str = "";
str.clear();
str.empty(); <--- Also found out this checks if it is empty, not empties it :/

So, some specs follow this statement:
Win7
64-bit
VC++ Compilier

Now for the code!:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
int main()
{
for(;;)
{
	string str;

	cin.ignore();
	getline(cin, str);

	StrProcess(str);

        //How to ---
        //Clear string str here
        //Reuse it when for loops again
        //Send the new str to StrProcess
}
}

void StrProcess(string str)
{
        cout << str << endl;
}


Any ideas?

Thanks!

EDIT:::
Sorry, the question is how to empty a string for reuse, the code does not work.
Last edited on
It isn't clear what the question is.
EDIT:::
Sorry, the question is how to empty a string for reuse, the code does not work.
You don't need to clear it, Just assign a new value and keep going.

clear() clears the container.
Your question is somewhat funny, as the string is automatically deleted at every loop iteration and a new string is created every time the for loop runs. To "reuse" it declare it as [b]static[b] or declare the string outside of for loop.
Ok, well based off the responses, the string is probably not the problem, at first I didn't want to post my actual code, it is pretty long, maybe someone can compile it and see what is going on, a bit of it is still test code so yeah. The problem is that I can only put in one command, then anything after that doesn't work. This is supposed to be a terminal type thing.

Current commands (CAPS Sensitive):
CD
Start
Help

Directories (For CD Command):
Desktop
Documents
Downloads
Tools

Start will tell you it is Starting whatever you type in, that is a WIP.
Help displays a basic help screen.

When it asks for username, it is Admin, it won't ask for a Password, Admin account doesn't have a password for testing. Can't make accounts as of yet, that will probably be added later.

Anyways,
the code.

Main.cpp
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
#include "Header.h"

int main()
{
	string cmd;
	bool exit = false;

	user = Login();
	cout << "Welcome, " << user << ". You have mail!" << endl;
	cmd = GetCmd();
	system("pause");
}

void CheckCmd(string cmd, string flag, int num)
{
	//switch(num)
	//{
	////CD Commnad
	//case 0:
	//	cout << "You are now browsing \"" << flag << "\"" << endl;
	//break;
	////Start Command
	//case 1:
	//	cout << "Starting " << flag << "..." << endl;
	//break;
	////Help Command
	//case 2:
	//	cout << "Commands" << endl;
	//	cout << "==================" << endl << endl;
	//	cout << "CD (Option) - Changes your current Directory to Option" << endl;
	//	cout << "Start (Option) - Starts Option on localhost" << endl;
	//	cout << "Help - Displays this page" << endl;
	//break;
	//}

	if(num == 0)
		cout << "You are now browsing \"" << flag << "\"" << endl;

	if(num == 1)
		cout << "Starting " << flag << "..." << endl;

	if(num == 2)
	{
		cout << "Commands" << endl;
		cout << "==================" << endl << endl;
		cout << "CD (Option) - Changes your current Directory to Option" << endl;	
		cout << "Start (Option) - Starts Option on localhost" << endl;
		cout << "Help - Displays this page" << endl;
	}
}

void CmdParse(string cmdtxt)
{
	unsigned pos = cmdtxt.find(" ");
	string cmdbody = cmdtxt.substr(0,pos);
	string cmdflagtmp = cmdtxt.substr(pos+1,200);
	unsigned pos1 = cmdflagtmp.find(" ");
	string cmdflag = cmdtxt.substr(pos + 1,pos1);
	int cmdnum;

	if (cmdbody == "CD")
	{
		cmdnum = 0;
		bool DirAvail = CheckDir(cmdflag);

		if(DirAvail == false)
		{
			cout << "ERROR: Error#103 - Directory not found" << endl;
			return;
		}
		CheckCmd(cmdbody, cmdflag, cmdnum);
	}

	if (cmdbody == "Start")
	{
		cmdnum = 1;
		CheckCmd(cmdbody, cmdflag, cmdnum);
	}

	if (cmdbody == "Help")
	{
		cmdnum = 2;
		CheckCmd(cmdbody, cmdflag, cmdnum);
	}
}

bool CheckDir(string Dir)
{
	const int dirmax = 4;
	string AllDir[dirmax] =
	{
		"Desktop",
		"Downloads",
		"Documents",
		"Tools"
	};

	for(int i = 0; i < dirmax; i++)
	{
		string LastDir = AllDir[i];
		if (Dir == LastDir)
		{
			Directory = Dir;
			return true;
		}
	}

	return false;
}

string Login()
{
	string user;
	string pass;
	string BadLogin = "164";

	cout << "Username: ";
	cin >> user;
	bool haspass = VaildUser(user);

	if (haspass == false)
	{
		cout << "Successfully logged into " << user << endl;
		return user;
	}

	cout << "Password: ";
	cin >> pass;

	bool IsVaild = VaildLogin(user, pass);
	if (IsVaild == false)
	{
		cout << "ERROR: Error#164 - Bad Login" << endl;
		return BadLogin;
	}

	cout << "Successfully logged into " << user << endl;
	return user;
}

bool VaildLogin(string user, string pass)
{
	const int numusers = 2;
	int usertmp;

	string userlist[numusers] =
	{
		"Admin",
		"Pass"
	};

	for (int i = 0; i < numusers; i++)
	{
		string lastuser = userlist[i];

		if (user == lastuser)
		{
			usertmp = i;
		}
	}

	usertmp =+ 1;

	if (pass == userlist[usertmp])
	{
		return true;
	}

	return false;
}

bool VaildUser(string user)
{
	const int numusers = 2;
	const int numuserpass = 1;

	string userlist[numusers] =
	{
		"Admin",
		" "
	};

	string userpasslist[numuserpass] =
	{
		""
	};

	for (int i = 0; i < numusers; i++)
	{
		string lastuser = userlist[i];

		if (user == lastuser)
		{
			for (int i = 0; i < numuserpass; i++)
			{
				string lastuser1 = userpasslist[i];

				if (user == lastuser1)
				{
					return true;
				}
			}

			return false;
		}
	}

	cout << "ERROR: Error#163 - Bad Login" << endl;
}

string GetCmd()
{
	string cmd;

	for(;;)
	{
		cout << "User>>" << user << ">>" << Directory << ">> ";
		cin.ignore();
		getline(cin, cmd);

		CmdParse(cmd);
		cmd = "";
	}
}


Header.h

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
//Includes
#include <iostream>
#include <string>

//Namespace
using namespace std;

//Variables
	//String
		string user;
		string Directory = "C-Drive";

//Declarations
	//Void
		void Inbox(int);
		void CheckCmd(string, string, int);
		void CmdParse(string);

	//String
		string Login();
		string GetCmd();

	//Boolean
		bool CheckDir(string);
		bool VaildLogin(string, string);
		bool VaildUser(string);
Ok, after a bit of testing, I found that the second loop around, and everything after that is subtracting the first letter, which is throwing the parser off. What is causing it to subtract the first letter?
cin.ignore(); is erasing the first letter...anyway around this???
Use getline(cin >> ws, someString); rather than cin.ignore(); getline(cin, someString);.

cin.ignore(); discards one character from the input buffer.
That character won't necessarily be a whitespace character (it might if you do cin >> something; before, but not always).
So your first letter is getting erased because you're literally telling cin to throw out the first letter.
Yes, I found a solution, similar to that one, thank you anyways!
Topic archived. No new replies allowed.