/*
Desc: Get a valid integer from keyboard.
It will check if there are non digits or too many digits.
A valid integer may include a sign and at most 9 digits.

Auth: Liutong XU
Date: 2017.12.16
*/

#include<stdio.h>
#include<stdlib.h>
#define MAXCHARS 81
#define TRUE 1
#define FALSE 0
int getanInt();
int isValidInt(char val[MAXCHARS]);
int main()
{
    int number;

    number = getanInt();

    printf("The number you entered is %d\n", number);
    return 0;
}

int getanInt()
{
    int isanInt = FALSE;
    char value[MAXCHARS];

    do
    {
        printf("Enter an integer, at most 9 digits plus one sign: ");
        fgets(value, MAXCHARS, stdin);

        int i = 0;
        while (value[i]!='\n' && i < 11) i++;   //11th char is invalid if any
        value[i] = '\0';

        isanInt = isValidInt(value);
        if (!isanInt)
        {
            printf("Invalid integer\n");
        }
     } while (!isanInt);

    return (atoi(value));
}

int isValidInt(char val[])
{
    int start = 0;
    int i;
    int valid = TRUE;
    int sign = FALSE;

    if (val[0] == '\0') valid = FALSE;
    if (val[0] == '-' || val[0] == '+')
    {
        sign = TRUE;
        start = 1;
    }
    if (sign == TRUE && val[1] == '\0') valid = FALSE;

    i = start;
    while (valid == TRUE && val[i] != '\0')
    {
        if (val[i] < '0' || val[i] > '9')
           valid = FALSE;
        i++;
    }
    if (i - sign > 9)
    {
        valid = FALSE;
        printf("Too many digits...");
    }

    return valid;
}