473,842 Members | 1,481 Online
Bytes | Software Development & Data Engineering Community
+ Post

Home Posts Topics Members FAQ

Verifying valid input in a loop

JR
Hey all,

I have read part seven of the FAQ and searched for an answer but can
not seem to find one.

I am trying to do the all too common verify the data type with CIN.
The code from the FAQ looks like this:

#include <iostream>

int main()
{
std::cout << "Enter a number, or -1 to quit: ";
int i = 0;
while (std::cin >> i) { // GOOD FORM
if (i == -1) break;
std::cout << "You entered " << i << '\n';
}
}
This works well except that I do not want to exit the loop unless a
valid input is entered. So if I enter an 'a' I want to stay in the
loop to allow for another chance at input not exit the loop. Can
someone please provide a modified version of this code that will allow
this?
Thanks,

James
Jul 22 '05 #1
7 7295

"JR" <JR*****@email. com> wrote in message
news:8b******** *************** ***@posting.goo gle.com...
Hey all,

I have read part seven of the FAQ and searched for an answer but can
not seem to find one.

I am trying to do the all too common verify the data type with CIN.
The code from the FAQ looks like this:

#include <iostream>

int main()
{
std::cout << "Enter a number, or -1 to quit: ";
int i = 0;
while (std::cin >> i) { // GOOD FORM
if (i == -1) break;
std::cout << "You entered " << i << '\n';
}
}
This works well except that I do not want to exit the loop unless a
valid input is entered. So if I enter an 'a' I want to stay in the
loop to allow for another chance at input not exit the loop. Can
someone please provide a modified version of this code that will allow
this?


It's difficult to validate input, it gets very fiddly. C++ cannot provide a
standard solution because what is valid input for one program is not valid
for another. And since you don't say what is valid input for your program
its impossible to give a detailed answer. I would guess that only positive
integers and -1 are valid for you.

However the general approach is simple enough. Read the input as a string,
check to see if the string is a valid number (whatever that means for your
program) and only then convert the string to an integer.

John
Jul 22 '05 #2
JR writes:
I am trying to do the all too common verify the data type with CIN.
The code from the FAQ looks like this:

#include <iostream>

int main()
{
std::cout << "Enter a number, or -1 to quit: ";
int i = 0;
while (std::cin >> i) { // GOOD FORM
if (i == -1) break;
std::cout << "You entered " << i << '\n';
}
}
This works well except that I do not want to exit the loop unless a
valid input is entered. So if I enter an 'a' I want to stay in the
loop to allow for another chance at input not exit the loop. Can
someone please provide a modified version of this code that will allow
this?


The overloaded >> specifies conversion. There is no back door way to get
the faulty input (for example, a letter), the stream goes into a fail state
if it gets bad input. So base your solution on getline() and do the
conversion "manually". Also, see ios::fail() and ios::clear(). The
simplest conversion would probably be strtol() in cstdlib. Using the stuff
in the iostreams package would be more elegant, but IMO harder.

You would have to give up the ability to display the faulty input to the
user if you wanted to persist in using cin.
Jul 22 '05 #3
In article <8b************ **************@ posting.google. com>,
JR <JR*****@email. com> wrote:

#include <iostream>

int main()
{
std::cout << "Enter a number, or -1 to quit: ";
int i = 0;
while (std::cin >> i) { // GOOD FORM
if (i == -1) break;
std::cout << "You entered " << i << '\n';
}
}
This works well except that I do not want to exit the loop unless a
valid input is entered. So if I enter an 'a' I want to stay in the
loop to allow for another chance at input not exit the loop. Can
someone please provide a modified version of this code that will allow
this?


First, let's just do the error checking for a single input, and not worry
about the "-1 to quit" yet:

int i;
cout << "Please enter an integer, and press ENTER: ";
while (! (cin >> i))
{
cin.clear(); // reset stream status flags
cin.ignore(1000 ,'\n'); // skip past next newline (ENTER), or 1000
// chars, whichever comes first
cout << "Hey dummy, I said enter an integer! Try again: ";
}

If you want to input repeatedly until the user enters -1, wrap this in
another loop that tests for end of data:

int i = 0;
while (i != -1)
{
cout << "Please enter an integer, and press ENTER: ";
while (! (cin >> i))
{
cin.clear();
cin.ignore(1000 ,'\n');
cout << "Hey dummy, I said enter an integer! Try again: ";
}
if (i != -1)
{
// process i normally
}
}

Or you can make the real processing-code a bit cleaner by writing a
function to do the input and error-checking:

bool GetNumber (int& num)
{
cout << "Please enter an integer, and press ENTER: ";
while (! (cin >> num))
{
cin.clear();
cin.ignore(1000 ,'\n');
cout << "Hey dummy, I said enter an integer! Try again: ";
}
return (num != -1); // returns true if not at end of input yet
}

// the real processing-code

int i;
while (GetNumber(i))
{
// process i normally
}

--
Jon Bell <jt*******@pres by.edu> Presbyterian College
Dept. of Physics and Computer Science Clinton, South Carolina USA
Jul 22 '05 #4
JR
jt*******@presb y.edu (Jon Bell) wrote in message news:<ch******* ***@jtbell.pres by.edu>...
<snip>>

First, let's just do the error checking for a single input, and not
worry
about the "-1 to quit" yet:

int i;
cout << "Please enter an integer, and press ENTER: ";
while (! (cin >> i))
{
cin.clear(); // reset stream status flags
cin.ignore(1000 ,'\n'); // skip past next newline (ENTER), or 1000
// chars, whichever comes first
cout << "Hey dummy, I said enter an integer! Try again: ";
}

If you want to input repeatedly until the user enters -1, wrap this in
another loop that tests for end of data:

int i = 0;
while (i != -1)
{
cout << "Please enter an integer, and press ENTER: ";
while (! (cin >> i))
{
cin.clear();
cin.ignore(1000 ,'\n');
cout << "Hey dummy, I said enter an integer! Try again: ";
}
if (i != -1)
{
// process i normally
}
}

Or you can make the real processing-code a bit cleaner by writing a
function to do the input and error-checking:

bool GetNumber (int& num)
{
cout << "Please enter an integer, and press ENTER: ";
while (! (cin >> num))
{
cin.clear();
cin.ignore(1000 ,'\n');
cout << "Hey dummy, I said enter an integer! Try again: ";
}
return (num != -1); // returns true if not at end of input yet
}

// the real processing-code

int i;
while (GetNumber(i))
{
// process i normally
}


Thanks All,

Jon I really like your solution. I came across is a couple hours
after I posted in this post .

http://groups.google.com/groups?hl=e...ng.c.moderated

This is essentially what I did and it is similar to the solution you
provided. It seems very elegant and easy to use. The ironic thing is
he posted that code to help him solve another problem. So his problem
was my solution. :)

Thank you again.
Jul 22 '05 #5

"JR" <JR*****@email. com> wrote in message
news:8b******** *************** ***@posting.goo gle.com...
jt*******@presb y.edu (Jon Bell) wrote in message
news:<ch******* ***@jtbell.pres by.edu>...
<snip>>

First, let's just do the error checking for a single input, and not
worry
about the "-1 to quit" yet:

int i;
cout << "Please enter an integer, and press ENTER: ";
while (! (cin >> i))
{
cin.clear(); // reset stream status flags
cin.ignore(1000 ,'\n'); // skip past next newline (ENTER), or
1000
// chars, whichever comes first
cout << "Hey dummy, I said enter an integer! Try again: ";
}

If you want to input repeatedly until the user enters -1, wrap this in
another loop that tests for end of data:

int i = 0;
while (i != -1)
{
cout << "Please enter an integer, and press ENTER: ";
while (! (cin >> i))
{
cin.clear();
cin.ignore(1000 ,'\n');
cout << "Hey dummy, I said enter an integer! Try again: ";
}
if (i != -1)
{
// process i normally
}
}

Or you can make the real processing-code a bit cleaner by writing a
function to do the input and error-checking:

bool GetNumber (int& num)
{
cout << "Please enter an integer, and press ENTER: ";
while (! (cin >> num))
{
cin.clear();
cin.ignore(1000 ,'\n');
cout << "Hey dummy, I said enter an integer! Try again: ";
}
return (num != -1); // returns true if not at end of input yet
}

// the real processing-code

int i;
while (GetNumber(i))
{
// process i normally
}


Thanks All,

Jon I really like your solution. I came across is a couple hours
after I posted in this post .


It has a weakness. Most people would consider 123abc to be erroneous input.
But the code above will read this as the integer 123, then loop and read abc
(which obviously it would consider an error).

If you want to avoid this problem, then you must read as a string and then
convert to an integer.

john

Jul 22 '05 #6

"JR" <JR*****@email. com> schrieb im Newsbeitrag
news:8b******** *************** ***@posting.goo gle.com...
Hey all,

I have read part seven of the FAQ and searched for an answer but can
not seem to find one.

I am trying to do the all too common verify the data type with CIN.
The code from the FAQ looks like this:

#include <iostream>

int main()
{
std::cout << "Enter a number, or -1 to quit: ";
int i = 0;
while (std::cin >> i) { // GOOD FORM
if (i == -1) break;
std::cout << "You entered " << i << '\n';
}
}
This works well except that I do not want to exit the loop unless a
valid input is entered. So if I enter an 'a' I want to stay in the
loop to allow for another chance at input not exit the loop. Can
someone please provide a modified version of this code that will allow
this?
Thanks,

James


I would do it like this:

#include <iostream>

using namespace std;

//clears an error in an input stream object like cin
//and makes it usable again by clearing the associated stream buffer
int ClearError(istr eam& isIn) // Clears istream object
{
streambuf* sbpThis;
char szTempBuf[20];
int nCount, nRet = isIn.rdstate();

if (nRet) // Any errors?
{
isIn.clear(); // Clear error flags
sbpThis = isIn.rdbuf(); // Get streambuf pointer
nCount = sbpThis->in_avail(); // Number of characters in buffer

while (nCount) // Extract them to szTempBuf
{
if (nCount > 20)
{
sbpThis->sgetn(szTempBu f, 20);
nCount -= 20;
}
else
{
sbpThis->sgetn(szTempBu f, nCount);
nCount = 0;
}
}
}

return nRet;
}
int main()
{
int pri = 0;
cout << "Enter a number: " << endl;
do
{
ClearError(cin) ;
cin >> pri;
} while (!cin);
return 0;
}
Jul 22 '05 #7
JR
"John Harrison" <jo************ *@hotmail.com> wrote in message news:<2q******* *****@uni-berlin.de>...
"JR" <JR*****@email. com> wrote in message
news:8b******** *************** ***@posting.goo gle.com...
jt*******@presb y.edu (Jon Bell) wrote in message
news:<ch******* ***@jtbell.pres by.edu>...
<snip>>

First, let's just do the error checking for a single input, and not
worry
about the "-1 to quit" yet:

int i;
cout << "Please enter an integer, and press ENTER: ";
while (! (cin >> i))
{
cin.clear(); // reset stream status flags
cin.ignore(1000 ,'\n'); // skip past next newline (ENTER), or
1000
// chars, whichever comes first
cout << "Hey dummy, I said enter an integer! Try again: ";
}

If you want to input repeatedly until the user enters -1, wrap this in
another loop that tests for end of data:

int i = 0;
while (i != -1)
{
cout << "Please enter an integer, and press ENTER: ";
while (! (cin >> i))
{
cin.clear();
cin.ignore(1000 ,'\n');
cout << "Hey dummy, I said enter an integer! Try again: ";
}
if (i != -1)
{
// process i normally
}
}

Or you can make the real processing-code a bit cleaner by writing a
function to do the input and error-checking:

bool GetNumber (int& num)
{
cout << "Please enter an integer, and press ENTER: ";
while (! (cin >> num))
{
cin.clear();
cin.ignore(1000 ,'\n');
cout << "Hey dummy, I said enter an integer! Try again: ";
}
return (num != -1); // returns true if not at end of input yet
}

// the real processing-code

int i;
while (GetNumber(i))
{
// process i normally
}


Thanks All,

Jon I really like your solution. I came across is a couple hours
after I posted in this post .


It has a weakness. Most people would consider 123abc to be erroneous input.
But the code above will read this as the integer 123, then loop and read abc
(which obviously it would consider an error).

If you want to avoid this problem, then you must read as a string and then
convert to an integer.

john

That is a good point. It also has the weakness of if 100,000 is
entered then only 100 is taken. It does seem that overall the input
as a string makes the most sense.

James
Jul 22 '05 #8

This thread has been closed and replies have been disabled. Please start a new discussion.

Similar topics

10
3576
by: Chris Sharman | last post by:
I'm doing a rough validation of an email address client-side (using js), but it's not enough - our customer service people are apparently incapable of typing in an email address without error - we get spaces, missing '@', multiple '@' which we can field, and simple mis-spellings, which we can't. I'd like to automate a 'mailto:' popup for them on submit, along the lines of "thanks for your email address, just verifying I've got it right"....
1
2154
by: jel | last post by:
I ran what was submitted in several forums, but it's not exactly what i'm looking for. I'm dy'n over here. Ah, the frustrations of an amateur programmer. I included the code below in c++. which details what i'm looking for. I'm sure its just a small detail. But I'm in the dark. // numbers1to10only.cpp #include <iostream.h>
10
2854
by: Doug O'Leary | last post by:
Hey, all. I have a perl script which generates the html listed below. I cleaned it up a bit since the perl CGI module creates some really ugly html code. I've looked at this thing 8 ways to Sunday, but I can't see anything wrong. When I hit the "Add" button, it immediately executes the action of the form skipping the validate_form function completely. I've tried the script section towards the top of the html as well as just before...
5
1559
by: DS | last post by:
How does one set-up a macro to do the following. When you enter an Employee Number in a log-in box Access checks the Employee Table to see if thats a valid Employee number. if it is the Macro continues along its way, if not it gives a message box saying that "This is not a valid Employee ID" DS
6
1290
by: John | last post by:
Hi I have several web forms that require users verification by entering a code before they are allowed in. I have created a separate web form for entering and verifying user code. How do I incorporate this with web forms that require security? I am very new to this and would appreciation some clarification on how this sort of thing works in asp.net. Thanks
7
2646
by: Hulo | last post by:
In a C program I am required to enter three numbers (integers) e.g. 256 7 5 on execution of the program. C:\> 256 7 5 There should be spaces between the three numbers and on pressing "enter", further processing is done. The problem requires me to check whether three numbers have actually been entered in the input line and to warn if less or more numbers have been entered.
2
2143
by: Sethos | last post by:
I am sure that this has been covered, hashed, and rehashed, but a search on the group did not produce the answer, so forgive me if this seems like a "newbie" type question... Besically, I have a form on which the users can click on a button to add text boxes dynamically. That all works without a hitch. The problem comes in trying to verify the information in the boxes. Below is a very abbreviated example of the code I have in the form:
4
1925
by: Mike | last post by:
Hi all, In my recent ASP.NET 2.0 appl, I need to verify that the supplied email address is valid or not. So, here's my situation: - In my <profilearea, I created <isVerifiedproperty. - Suppose a new user has been created. I set the profile.isverified to false. OnCreatedUser event I'll send him an email (to the supplied email address) to verify their email address with a link in it to an ASPX page that'll do the verification, e.g:...
1
1963
by: foothills bhc | last post by:
I have a problem with verifying content of controls on a form before closing the form or moving to the next form "record" (i.e., when moving to the next row of my form's record source). HERE'S THE LONG EXPLANATION OF THE PROBLEM First, A Description of the Form: I have developed a form for entering survey questionnaire data. The data to be entred on the form could be considered as two kinds of information. One kind could be called...
0
9876
marktang
by: marktang | last post by:
ONU (Optical Network Unit) is one of the key components for providing high-speed Internet services. Its primary function is to act as an endpoint device located at the user's premises. However, people are often confused as to whether an ONU can Work As a Router. In this blog post, we’ll explore What is ONU, What Is Router, ONU & Router’s main usage, and What is the difference between ONU and Router. Let’s take a closer look ! Part I. Meaning of...
0
9717
by: Hystou | last post by:
Most computers default to English, but sometimes we require a different language, especially when relocating. Forgot to request a specific language before your computer shipped? No problem! You can effortlessly switch the default language on Windows 10 without reinstalling. I'll walk you through it. First, let's disable language synchronization. With a Microsoft account, language settings sync across devices. To prevent any complications,...
0
10950
Oralloy
by: Oralloy | last post by:
Hello folks, I am unable to find appropriate documentation on the type promotion of bit-fields when using the generalised comparison operator "<=>". The problem is that using the GNU compilers, it seems that the internal comparison operator "<=>" tries to promote arguments from unsigned to signed. This is as boiled down as I can make it. Here is my compilation command: g++-12 -std=c++20 -Wnarrowing bit_field.cpp Here is the code in...
0
10617
jinu1996
by: jinu1996 | last post by:
In today's digital age, having a compelling online presence is paramount for businesses aiming to thrive in a competitive landscape. At the heart of this digital strategy lies an intricately woven tapestry of website design and digital marketing. It's not merely about having a website; it's about crafting an immersive digital experience that captivates audiences and drives business growth. The Art of Business Website Design Your website is...
0
10318
tracyyun
by: tracyyun | last post by:
Dear forum friends, With the development of smart home technology, a variety of wireless communication protocols have appeared on the market, such as Zigbee, Z-Wave, Wi-Fi, Bluetooth, etc. Each protocol has its own unique characteristics and advantages, but as a user who is planning to build a smart home system, I am a bit confused by the choice of these technologies. I'm particularly interested in Zigbee because I've heard it does some...
1
7862
isladogs
by: isladogs | last post by:
The next Access Europe User Group meeting will be on Wednesday 1 May 2024 starting at 18:00 UK time (6PM UTC+1) and finishing by 19:30 (7.30PM). In this session, we are pleased to welcome a new presenter, Adolph Dupré who will be discussing some powerful techniques for using class modules. He will explain when you may want to use classes instead of User Defined Types (UDT). For example, to manage the data in unbound forms. Adolph will...
0
5699
by: TSSRALBI | last post by:
Hello I'm a network technician in training and I need your help. I am currently learning how to create and manage the different types of VPNs and I have a question about LAN-to-LAN VPNs. The last exercise I practiced was to create a LAN-to-LAN VPN between two Pfsense firewalls, by using IPSEC protocols. I succeeded, with both firewalls in the same network. But I'm wondering if it's possible to do the same thing, with 2 Pfsense firewalls...
0
5886
by: adsilva | last post by:
A Windows Forms form does not have the event Unload, like VB6. What one acts like?
1
4506
by: 6302768590 | last post by:
Hai team i want code for transfer the data from one system to another through IP address by using C# our system has to for every 5mins then we have to update the data what the data is updated we have to send another system

By using Bytes.com and it's services, you agree to our Privacy Policy and Terms of Use.

To disable or enable advertisements and analytics tracking please visit the manage ads & tracking page.