Search code examples
cinputintegerscanfrestriction

Using scanf only for integers in c


I need to get user input for a number between 0 and 100. The problem is when i input letter in scanf the program crashes or recognizes it as a 0.I want to avoid any user mistake that would potentially crash my program.I used getch previously but i don't know how to get multiple digit numbers with it. Any help on how to solve this problem would be nice. Thank you.

do
    {
        printf("Enter ID: ");
        scanf("%d", &NewWorkder->id);
        TargetList= FillWorker();
        TargetList= SeekList(Head, NewWorker->id);
    }
    while (NewWorker->id<0 || NewWorker->id>100 || (TargetList)!= (NULL) ||NewWorker->id ==0);
    fprintf(filemechanic,"%s %s %d\n", NewWorker->name, NewWorker->surname, NewWorker->id);
    free(TargetList);
    fclose(filemechanic);
}

Solution

  • Don't use scanf at all. Maybe you could use its return value to see if no digits were entered at all, but if you don't want an input like 12ab to be valid, scanf won't help.

    Here's an example that uses fgets and strtol to check for a valid number:

    #include <stdio.h>
    #include <stdlib.h>
    
    int main(void)
    {
        char nptr[1024];
        char *errptr;
        long n = 0;
        do
        {
            printf("Enter a base-10 number: ");
            fgets(nptr, sizeof nptr, stdin);
            n = strtol(nptr, &errptr, 10);
        } while ((*errptr != '\n' && *errptr != '\0') || n < 0 || n > 100);
    }
    

    Example of running:

    Enter a base-10 number: ab
    Enter a base-10 number: 12ab
    Enter a base-10 number: -1
    Enter a base-10 number: 101
    Enter a base-10 number: 123
    Enter a base-10 number: 50
    [end]