Input Validation for only positive integers C++

Click For Summary
SUMMARY

The discussion focuses on implementing input validation in a C++ program to ensure only positive integers are accepted. The user initially struggled with inputs like '3.2' and '3/2', which were incorrectly processed. A solution was provided using the condition `(cin>>number).fail() || number < 0 || cin.peek() != '\n'` to effectively reject invalid inputs. This approach ensures that any non-integer input results in an "Invalid Input" message, enhancing the robustness of the program.

PREREQUISITES
  • Understanding of C++ basic syntax and data types, particularly int.
  • Familiarity with input/output operations in C++, specifically cin and cout.
  • Knowledge of control flow statements, including while loops and conditional checks.
  • Basic understanding of error handling in C++ using cin.clear() and cin.peek().
NEXT STEPS
  • Explore advanced input validation techniques in C++, including regular expressions.
  • Learn about exception handling in C++ to manage input errors more gracefully.
  • Investigate the use of custom input functions to encapsulate validation logic.
  • Study the differences between data types in C++, particularly int, float, and double, and their implications for input validation.
USEFUL FOR

Beginner C++ programmers, educators teaching programming fundamentals, and developers looking to enhance user input handling in console applications.

USN2ENG
Messages
107
Reaction score
0

Homework Statement


I created a program that will calculate the factorial of the number entered and am having a hard time getting it to not accept decimals or fractions.
Code:
#include <iostream>
using namespace std;
int main (){
	int q=0;
	int number = 0;
		
	cout<<"Please enter a positive whole number:"<<endl;
	/*cin>>number;*/
	while(!(cin>>number)||number<0){
		cin.clear();
		while(cin.get()!='\n'){ [B]/*Also, this was the only thing I could find to stop it from looping Invalid input endlessly but I am not sure exactly what this is doing, if anyone could explain that would help a lot*/[/B]
			continue;
			cin>>number;
		}
		cout<<"Invalid Input"<<endl;
		}
	int x = number;	
	int y=1;
	while(x>1){
		y = y*x;
		x--;
		}
	cout<<y;
	return 0;
}

The Attempt at a Solution



I am 2 months into my first programming class ever and I can't seem to figure out how to get around the fact that if I enter '3.2' or '3/2' it will only look at the '3' and not the '.2', or '/2'. I would probably need to change the data type to float or something but then I am not sure how to use the input validation after that. I tried using isdigit(number) but that was not working either.
I have googled just about everything I could think of but I am not sure where to go. If anyone can point me in the right direction that would help immensely! Thanks!
Chuck
 
Physics news on Phys.org
I'm not sure what your problem is. Your input variable is number, which is type int. When your program prompts you to enter a positive integer, if you type 3.2, the program will accept only the integer part, not the decimal portion. Isn't this what you want?

Also, if you type in 3/2, your haven't written your program to parse arithmetic expressions such as 3/2 or 5+ 7 and so on.
 
I wanted it to see that the decimal was there and then declare it invalid. Basically I wanted it to see if anything other than an integer is there, it is then invalid.

I was able to do it with:

Code:
 cout<<"Please enter a positive whole number:"<<endl;
	
	while((cin>>number).fail()||number<0 ||cin.peek() != '\n'){
		cin.clear();
		while(cin.get()!='\n'){
			continue;
			cin>>number;
		}
		cout<<"Invalid Input"<<endl;
		}

Thanks for all the help!
 
Last edited:

Similar threads

  • · Replies 3 ·
Replies
3
Views
1K
  • · Replies 2 ·
Replies
2
Views
3K
  • · Replies 2 ·
Replies
2
Views
3K
  • · Replies 8 ·
Replies
8
Views
2K
  • · Replies 2 ·
Replies
2
Views
2K
  • · Replies 6 ·
Replies
6
Views
3K
  • · Replies 7 ·
Replies
7
Views
2K
  • · Replies 8 ·
Replies
8
Views
2K
  • · Replies 3 ·
Replies
3
Views
2K
  • · Replies 1 ·
Replies
1
Views
1K