Ansh - 1 year ago 61
C Question

# Testing while for multiple conditions (C language)

I have to create a menu wherein if the input is not valid. It should keep asking for a valid input. I've written it below (in C)

``````   #include <stdio.h>
int main()
{
int input = 0;
printf("What would you like to do? \n 1 (Subtraction) \n 2 (Comparison) \n 3 (Odd/Even) \n 4 (Exit) \n ");
scanf_s("%d", &input);

while (input != 1 || input != 2 || input != 3|| input != 4)
{
printf("Please enter a valid option \n");
scanf_s("%d", &input);
}   // At this point, I think it should keep testing variable input and if it's not either 1 or 2 or 3 or 4. It would keep looping.
``````

But what's happening is it loops even when the input is, for example, 2.

Your code is saying: Loop as long as the following is true:

``````(input != 1 || input != 2 || input != 3 || input != 4)
``````

Turning this around the code says: Break the loop if the above condition is false, which is true for

``````!(input != 1 || input != 2 || input != 3 || input != 4)
``````

Now let's apply De Morgan's Law to the above expression and we'll get the logical equal expression (as the loop's break condition):

``````(input == 1 && input == 2 && input == 3 && input == 4)
``````

The loop will break if the above is true. It is true if `input` equals `1` and `2` and `3` and `4` at the same time. This is not possible, so the loop will run forever.

But what's happening is it loops even when the input is, for example, 2.

If `input` is `2` it's still unequal `1`, `3` and `4`, which makes the loop-condition become true and looping goes on. :-)

As you want the loop's code to be execute at least once, you ought to use a `do {...} while`-loop.

``````do
{
printf("Please enter a valid option \n");
scanf_s("%d", &input);
} while !(input == 1 || input == 2 || input == 3 || input == 4)
``````

or (following De Morgan again):

``````do
{
printf("Please enter a valid option \n");
scanf_s("%d", &input);
} while (input != 1 && input != 2 && input != 3 && input != 4)
``````

or even tighter:

``````do
{
printf("Please enter a valid option \n");
scanf_s("%d", &input);
} while (input < 1 || input > 4)
``````
Recommended from our users: Dynamic Network Monitoring from WhatsUp Gold from IPSwitch. Free Download