scanf()
поведение при переполнении целочисленного преобразования не определено.
Используйте fgets()
, чтобы прочитать все входные данные. Ditch scanf()
.
Использование strtol()
для анализа строки: улучшенная обработка ошибок и обнаружение переполнения.
#include <errno.h>
#include <stdio.h>
// return true when good
// return false on EOF
bool verificate(int *dest, int min, int max) {
char buf[80];
while (fgets(buf, sizeof buf, stdin)) {
char *endptr;
errno = 0;
long num = strtol(buf, &endptr, 0);
// numeric input? overflow? >= min? <= max?
if (endptr > buf && errno != ERANGE && num >= min && num <= max) {
*dest = (int) num;
return true;
}
printf("\tNon-numeric input or out of %d %d range:\n", min, max);
}
return false;
}
Пример использования
#define MIN 0
#define MAX INT_MAX
int main() {
int num1 = 0;
if (verificate(&num1, MIN, MAX) {
printf("Number = %d",num1);
}
}