0

Hi,
I've got problem with method ignore from cin.
This is my code:

void _name()
{
	string name;
	char ch = 0;
	bool name_accepted = false;
	cout << "Enter your name: " << endl;
	while (!name_accepted)
	{
		while (ch = cin.get())
		{
			//cin.
			if (isalnum(ch) || isspace(ch) || ispunct(ch)) //construct name
			{
				name += ch;
				if ((ch == '\n') && cin && (name == ""))
				{
					name = "UNNAMED";
				}
				if ((ch == '\n') && cin && (name != ""))
				{
					name_accepted = true;
				}
			}
			else
			{
				cerr << "Bad input. Try again." << endl;
				cin.clear(ios_base::failbit); //set to fail
			}


			if (!cin)
			{
				name = "";
				ch = 0;
				cin.ignore(256);
				//cin.seekg(0);
				//cin >> _dump;
				cin.clear();
			}
		}
		if (!cin)
		{
			//throw new _Exit();
			cerr << "Bad input. Try again." << endl;
			name = "";
			ch = 0;
			cin.ignore(256);
			//cin.seekg(0);
			//cin >> _dump;
			cin.clear();
		}

	}

}

but when I enter :
a^A^Atom (letter a, ctrl+A, ctrl+A, t, o,m), it catches correctly error but ignore seems to ignore just one sign instead of ignoring all of them. Hope someone will help with this. Thank you.

2
Contributors
4
Replies
5
Views
7 Years
Discussion Span
Last Post by atch
0

Your inner loop does not account for the name being accepted and there is no way to break out of it without somehow signaling a character that has a value of 0. This will work better:

while (!name_accepted && cin.get(ch))

Otherwise the code works fine.

0

Tom Gunn,
it doesn't work correctly. Try input (letter a, ctrl+A, ctrl+A, t, o,m). In my opinion it should discard everything after encountering first "bad" character but it doesn't do that for reason that I don't know and would like to know. cin.ignore(256) seems to throw away just one character instead of "all" of them. Any reason why?

1

The order of cin.clear() and cin.ignore() is backward. cin.ignore() is just as much a read as cin.get() , so if the stream is in an error state, nothing will be read. The code needs to clear first, then ignore:

if (!cin)
{
    name.clear();
    cin.clear();
    cin.ignore(256, '\n');
}

I also added '\n' to the call because the delimiter defaults to EOF. That turns cin.ignore() into a blocking read because it waits for up to 256 characters or EOF.

Votes + Comments
Perfect!
0

Tom Gunn,
It's working this time. Thank you.

This question has already been answered. Start a new discussion instead.
Have something to contribute to this discussion? Please be thoughtful, detailed and courteous, and be sure to adhere to our posting rules.