'C Programming yes no loop with error catcher

I am trying to get this yes no programme to work in a loop. I've checked the other users messages and there's only one which is poorly written and doesn't work properly.

So if the user types y or Y it installs and if they type n or N it exits out of the program. Also if they type w, m or any other letter that isn't y or n it goes back to the start and asks them again.

Not sure if its a while loop or a do while loop. The programme below works but doesn't have any loops.

#include <stdio.h>

int main() {

    char yn;

    printf("Do you want to install this programme? y/n: ");
    scanf("%c", &yn);

    if(yn == 'y' ||  yn == 'Y') {
        printf("Installing...\n");
    }
    else if(yn == 'n' || yn == 'N') {
        printf("Exiting programme!\n");
    }
    else {
        // Go back to the start/top of the programme!
    }
    return 0;
}


Solution 1:[1]

Solved!

This is the code that works. Thanks to @govindparmar.

#include <stdio.h>

int main() {

    char yn;

    do {
    printf("Do you want to install this programme? y/n: ");
    scanf(" %c", &yn);
    }
    while(yn != 'n' && yn != 'N' && yn != 'y' && yn != 'Y');

    if(yn == 'n' ||  yn == 'N') {
    printf("Exiting programe!\n");
    }
    else {
    printf("Installing...\n");
    }

    printf("It works!\n");

    return 0;
}

Solution 2:[2]

You can wrap your code into a while-loop.

Something like:

while(1)
{
    printf("Do you want to install this programme? y/n: ");
    scanf("%c", &yn);

    if(yn == 'y' ||  yn == 'Y') {
        printf("Installing...\n");
        break;  // Stop the while-loop to end the program
    }
    else if(yn == 'n' || yn == 'N') {
        printf("Exiting programme!\n");
        break;  // Stop the while-loop to end the program
    }
}

Solution 3:[3]

The type of loop that makes most sense in this scenario is a do/while loop since getting a response from a user is something that should happen at least once and be tested for until a desired response is obtained from the user.

Also, using tolower or toupper on yn when checking for equality can eliminate the need to check both upper and lowercase.

do
{
     printf("Do you want to install this program? y/n: ");
     scanf(" %c", &yn);
}
while(tolower(yn) != 'n' && tolower(yn) != 'y');

if(tolower(yn) == 'n')
{
     printf("Exiting program\n");
}
else
{
     printf("Installing ...\n");
}

Solution 4:[4]

fgets can be used to capture the input. It has an advantage of being able to clear the input stream in case of too many characters or incorrect characters.

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

int main ( void) {
    char input[3] = "";//can hold one char a newline and a '\0'

    printf("Do you want to install this programme? y/n: ");

    do {
        printf ( "\nenter y or n\n:");
        if ( fgets ( input, sizeof input, stdin)) {
            if ( !strchr ( input, '\n')) {//is there a newline?
                while ( !strchr ( input, '\n')) {//call until newline is found to clear input
                    if ( !fgets ( input, sizeof input, stdin)) {
                        fprintf ( stderr, "\nEOF problem\n");
                        return 1;
                    }
                }
                input[0] = 0;
                printf ( "\ntoo many characters. try again.");
            }
        }
        else {
            fprintf ( stderr, "\nEOF problem\n");
            return 1;
        }
        if ( input[0] == 'y' || input[0] == 'Y') {
            printf("Installing...\n");
        }
        if ( input[0] == 'n' || input[0] == 'N') {
            printf("Exiting programme!\n");
        }
    } while ( input[0] != 'y' && input[0] != 'n' && input[0] != 'Y' && input[0] != 'N');

    return 0;
}

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1 ziggelflex
Solution 2 Support Ukraine
Solution 3
Solution 4 user3121023