0

This is my code so far

#include <stdio.h>
#include <string.h>  

int main() {
    char size[10];
    const char drinks[4][10] = {
        "Coffee",
        "Tea",
        "Chocolate",
        "Soda"
    };
    const char sizes[3][10] = {
        "Small",
        "Medium",
        "Large"
    };
    char drinksName[10];
    do {
        printf("\nDrinks name: ");
        scanf("%s", drinksName);
        if (strcmp(drinksName, drinks[0]) != 0 || strcmp(drinksName, drinks[1]) != 0 || strcmp(drinksName, drinks[2]) != 0 || strcmp(drinksName, drinks[3]) != 0) {
            printf("Not available.");
        }
    } while (strcmp(drinksName, drinks[0]) != 0 || strcmp(drinksName, drinks[1]) != 0 || strcmp(drinksName, drinks[2]) != 0 || strcmp(drinksName, drinks[3]) != 0);
    do {
        printf("\nSize: ");
        scanf("%s", size);
        if (strcmp(size, sizes[0]) != 0 || strcmp(size, sizes[1]) != 0 || strcmp(size, sizes[2]) != 0) {
            printf("Not available.");
        }
    } while (strcmp(size, sizes[0]) != 0 || strcmp(size, sizes[1]) != 0 || strcmp(size, sizes[2]) != 0);
}

When I try to run my program, input always loop whereas my input is true, ex: "Coffee". Is there an error in my looping code?

do {
        printf("\nDrinks name: ");
        scanf("%s", drinksName);
        if (strcmp(drinksName, drinks[0]) != 0 || strcmp(drinksName, drinks[1]) != 0 || strcmp(drinksName, drinks[2]) != 0 || strcmp(drinksName, drinks[3]) != 0) {
            printf("Not available.");
        }
    } while (strcmp(drinksName, drinks[0]) != 0 || strcmp(drinksName, drinks[1]) != 0 || strcmp(drinksName, drinks[2]) != 0 || strcmp(drinksName, drinks[3]) != 0);

I'm confused why this happened.

1 Answers1

0

Your code means to continue the loop if your input is differ from one of the elements. This condition will always be true because there are different elements.

You should check if you input is differ from all of the elements by using && (logical AND) operator instead of || (logical OR) operator like this:

do {
    printf("\nDrinks name: ");
    if (scanf("%9s", drinksName) != 1) {
        fputs("Read error.\n", stderr);
        return 1;
    }
    if (strcmp(drinksName, drinks[0]) != 0 && strcmp(drinksName, drinks[1]) != 0 && strcmp(drinksName, drinks[2]) != 0 && strcmp(drinksName, drinks[3]) != 0) {
        printf("Not available.");
    }
} while (strcmp(drinksName, drinks[0]) != 0 && strcmp(drinksName, drinks[1]) != 0 && strcmp(drinksName, drinks[2]) != 0 && strcmp(drinksName, drinks[3]) != 0);

Also note that you should specify the maximum length of string to read to avoid buffer overrun and check the return value of scanf() to check if reading succeeded.

Another option is using a loop to find a matching element like this:

int matchFound;
do {
    printf("\nDrinks name: ");
    if (scanf("%9s", drinksName) != 1) {
        fputs("Read error.\n", stderr);
        return 1;
    }
    matchFound = 0;
    for (size_t i = 0; i < sizeof(drinks) / sizeof(drinks[0]); i++) {
        if (strcmp(drinksName, drinks[i]) == 0) {
            matchFound = 1;
            break;
        }
    }
    if (!matchFound) {
        printf("Not available.");
    }
} while (!matchFound);
MikeCAT
  • 73,922
  • 11
  • 45
  • 70