/*
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)
{
}
} while (!isanInt);
}
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;
}
return valid;
}
LyoKRGVzYzogR2V0IGEgdmFsaWQgaW50ZWdlciBmcm9tIGtleWJvYXJkLgpJdCB3aWxsIGNoZWNrIGlmIHRoZXJlIGFyZSBub24gZGlnaXRzIG9yIHRvbyBtYW55IGRpZ2l0cy4KQSB2YWxpZCBpbnRlZ2VyIG1heSBpbmNsdWRlIGEgc2lnbiBhbmQgYXQgbW9zdCA5IGRpZ2l0cy4KCkF1dGg6IExpdXRvbmcgWFUKRGF0ZTogMjAxNy4xMi4xNgoqLwoKI2luY2x1ZGU8c3RkaW8uaD4KI2luY2x1ZGU8c3RkbGliLmg+CiNkZWZpbmUgTUFYQ0hBUlMgODEKI2RlZmluZSBUUlVFIDEKI2RlZmluZSBGQUxTRSAwCmludCBnZXRhbkludCgpOwppbnQgaXNWYWxpZEludChjaGFyIHZhbFtNQVhDSEFSU10pOwppbnQgbWFpbigpCnsKICAgIGludCBudW1iZXI7CgogICAgbnVtYmVyID0gZ2V0YW5JbnQoKTsKCiAgICBwcmludGYoIlRoZSBudW1iZXIgeW91IGVudGVyZWQgaXMgJWRcbiIsIG51bWJlcik7CiAgICByZXR1cm4gMDsKfQoKaW50IGdldGFuSW50KCkKewogICAgaW50IGlzYW5JbnQgPSBGQUxTRTsKICAgIGNoYXIgdmFsdWVbTUFYQ0hBUlNdOwoKICAgIGRvCiAgICB7CiAgICAgICAgcHJpbnRmKCJFbnRlciBhbiBpbnRlZ2VyLCBhdCBtb3N0IDkgZGlnaXRzIHBsdXMgb25lIHNpZ246ICIpOwogICAgICAgIGZnZXRzKHZhbHVlLCBNQVhDSEFSUywgc3RkaW4pOwoKICAgICAgICBpbnQgaSA9IDA7CiAgICAgICAgd2hpbGUgKHZhbHVlW2ldIT0nXG4nICYmIGkgPCAxMSkgaSsrOyAgIC8vMTF0aCBjaGFyIGlzIGludmFsaWQgaWYgYW55CiAgICAgICAgdmFsdWVbaV0gPSAnXDAnOwoKICAgICAgICBpc2FuSW50ID0gaXNWYWxpZEludCh2YWx1ZSk7CiAgICAgICAgaWYgKCFpc2FuSW50KQogICAgICAgIHsKICAgICAgICAgICAgcHJpbnRmKCJJbnZhbGlkIGludGVnZXJcbiIpOwogICAgICAgIH0KICAgICB9IHdoaWxlICghaXNhbkludCk7CgogICAgcmV0dXJuIChhdG9pKHZhbHVlKSk7Cn0KCmludCBpc1ZhbGlkSW50KGNoYXIgdmFsW10pCnsKICAgIGludCBzdGFydCA9IDA7CiAgICBpbnQgaTsKICAgIGludCB2YWxpZCA9IFRSVUU7CiAgICBpbnQgc2lnbiA9IEZBTFNFOwoKICAgIGlmICh2YWxbMF0gPT0gJ1wwJykgdmFsaWQgPSBGQUxTRTsKICAgIGlmICh2YWxbMF0gPT0gJy0nIHx8IHZhbFswXSA9PSAnKycpCiAgICB7CiAgICAgICAgc2lnbiA9IFRSVUU7CiAgICAgICAgc3RhcnQgPSAxOwogICAgfQogICAgaWYgKHNpZ24gPT0gVFJVRSAmJiB2YWxbMV0gPT0gJ1wwJykgdmFsaWQgPSBGQUxTRTsKCiAgICBpID0gc3RhcnQ7CiAgICB3aGlsZSAodmFsaWQgPT0gVFJVRSAmJiB2YWxbaV0gIT0gJ1wwJykKICAgIHsKICAgICAgICBpZiAodmFsW2ldIDwgJzAnIHx8IHZhbFtpXSA+ICc5JykKICAgICAgICAgICB2YWxpZCA9IEZBTFNFOwogICAgICAgIGkrKzsKICAgIH0KICAgIGlmIChpIC0gc2lnbiA+IDkpCiAgICB7CiAgICAgICAgdmFsaWQgPSBGQUxTRTsKICAgICAgICBwcmludGYoIlRvbyBtYW55IGRpZ2l0cy4uLiIpOwogICAgfQoKICAgIHJldHVybiB2YWxpZDsKfQ==