Reputation: 117
I have a pretty simple C++ console program. It's working fine, but I have some issues. I have 2 functions. First function called "input" asks from user to input numbers from 6 to 10. In that function I declared:
if ((a[i][j] < 6) || (a[i][j] > 10))
{
cout<<"Invalid input!";
return 0;
}
Second function called "output", prints out those numbers from first function.
In the main it is like:
int main ()
{
...
input (matrix, number);
output (matrix, nubmer);
}
My question is this. When I input number that isn't 6-10, my program still do "output" function, so it prints some random numbers. How can I break whole program in exact time when input rules are broken? Without any random output and stuff, just to print "Invalid output", then to start program from the start?
Upvotes: 1
Views: 471
Reputation: 361732
An idiomatic code would be this:
while(input (matrix, number)) //idiomatic loop
{
output (matrix, nubmer);
}
The input()
function should return false
or 0
when the input is invalid, and true
or non-zero, when the input is valid.
The loop above has the same form as we write std::istream
idioms:
std::string word;
while( std::cin >> word )
{
//..
}
//Or
ifstream file;
//...
while( file >> word )
{
//..
}
//Or
while( std::getline(file, word))
{
//..
}
I just explained this idiom here, as to how it works:
Upvotes: 2
Reputation: 2896
There are plenty of solutions. One is to declare the input
function to return an integer. On success input
can return 0
. On failure (the input is outside the range 6-10) input
returns a negative number (-1
for simplicity). Inside your main function, use a while loop to continue calling input
until it returns 0 for success. Each time input
fails you can print a message telling the client to enter try again. If you want to exit immediately after the first input
failure, you can call exit(1)
inside your main
.
Upvotes: 1
Reputation: 13570
If your input function return 0 on invalid input and another value on success you can run a loop until your input is valid
...
while(input(matrix,number) == 0);
...
Upvotes: 2
Reputation: 147028
The usual way to indicate errors is to throw an exception.
int main() {
...
try {
input(matrix, number);
output(matrix, number);
} catch(std::exception& e) {
std::cout << "Error: " << e.what();
}
}
In input:
if ((a[i][j] < 6) || (a[i][j] > 10))
{
throw std::runtime_error("Invalid input!");
}
Upvotes: 2
Reputation: 26739
You may check the return value of input()
before calling output()
.
You can use the exit()
function to terminate the program
Upvotes: 7
Reputation:
if(input(matrix,number) != 0) output(matrix,number);
// You don't {} for a single instruction
This should fix your problem.
Upvotes: 3