Login | Register   
RSS Feed
Download our iPhone app
Browse DevX
Sign up for e-mail newsletters from DevX

By submitting your information, you agree that devx.com may send you DevX offers via email, phone and text message, as well as email offers about other products and services that DevX believes may be of interest to you. DevX will process your information in accordance with the Quinstreet Privacy Policy.


Using String-based Data Validation-3 : Page 3




Building the Right Environment to Support AI, Machine Learning and Deep Learning

String-based Data Validation Works Better
Instead of relying on a field's datatype, read all the values as strings and test them. A valid number of passengers, for example, should only contain digits. The revised get_details() function now looks as follows:

#include <algorithm> void booking::get_details() { string num; bool kosher=false; cout<< "enter number of passengers: "<> endl; cin>>num; //make sure that num contains digits exclusively if(find_if(num.begin(),num.end(), nondigit())==num.end()) kosher=true; // we have a valid string else // we have an invalid string }

The interesting part is the find_if() call. The algorithm find_if() defined in <algorithm> takes three parameters: two input iterators that mark the sequence's beginning and end, respectively and a predicate. Our predicate can be an address of a function, say isalpha() or it can be a function object whose overloaded () operator returns bool. For each character in the string num, find_if() calls the predicate. If any of the characters isn't a digit, find_if() returns an iterator pointing to the first non-digit character. Otherwise, it returns a value equal to the second argument. In other words, the user's input is kosher if find_if() returns num.end().

The nondigit function object uses the standard function isdigit() declared in <cctype>. It negates the result of isdigit() and returns it:

class nondigit { public: bool operator() (char c) {return !isdigit(c);} };

If the string is kosher, we can proceed to the next step, namely converting it to int. We use a stringstream object for this:

if(kosher==true) { stringstream s(num); //insert string to s s>>passenger; //extract int value and write it to passenger }

In case of an invalid string, we can display a detailed error message to the user, possibly highlighting the first invalid characters in the entered string.

Danny Kalev is a system analyst and software engineer with 13 years of experience, specializing in C++ and object-oriented analysis and design. He is a member of the ANSI C++ standardization committee and the author of ANSI/ISO C++ Professional Programmer's Handbook (Que, 1999, ISBN: 0789720221).
Comment and Contribute






(Maximum characters: 1200). You have 1200 characters left.



Thanks for your registration, follow us on our social networks to keep up-to-date