1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65
| #include <assert.h>
#include <errno.h>
#include <limits.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
static int read_int(const char *input,
int min_value, int max_value,
int* number, const char** error)
{
char *end;
long ret;
assert(input != NULL);
assert(min_value <= max_value);
assert(number != NULL);
assert(error != NULL);
errno = 0;
ret = strtol(input, &end, 10);
if(end != input) {
if((ret == LONG_MAX && errno == ERANGE) || (ret > max_value)) {
*error = "the input number is too big";
return -1;
}
if((ret == LONG_MIN && errno == ERANGE) || (ret < min_value)) {
*error = "the input number is too small";
return -1;
}
if (*end != '\0') {
*error = "the input contains more than a number";
return -1;
}
*error = "";
*number = (int)ret;
} else {
*error = "the input is not a number";
return -1;
}
return 0;
}
int main(void)
{
int n;
const char* err;
assert(read_int("1", 1, INT_MAX, &n, &err) == 0);
assert(read_int("42", 1, INT_MAX, &n, &err) == 0);
assert(read_int("2147483647", 1, INT_MAX, &n, &err) == 0);
assert(read_int("", 1, INT_MAX, &n, &err) == -1);
assert(read_int("d", 1, INT_MAX, &n, &err) == -1);
assert(read_int("d85", 1, INT_MAX, &n, &err) == -1);
assert(read_int("10.5", 1, INT_MAX, &n, &err) == -1);
assert(read_int("58ef", 1, INT_MAX, &n, &err) == -1);
assert(read_int("0", 1, INT_MAX, &n, &err) == -1);
assert(read_int("-3", 1, INT_MAX, &n, &err) == -1);
assert(read_int("2147483648", 1, INT_MAX, &n, &err) == -1);
return 0;
} |
Partager