C - Контроль переполнения (вставка значений с клавиатуры) - PullRequest
1 голос
/ 20 апреля 2020

Я пытаюсь ограничить пользователя, добавляя к нему минимальные и максимальные значения:

int verificate( int num, int min,  int max) {
while( (num > max) || (num < min) ) {
    printf("\tBig number try again:");
    scanf(" %d",&num);
}
return num;
}

Main. c

#include <stdio.h>
#include <stdlib.h>
#include <limits.h>

#define MIN 0
#define MAX INT_MAX

void main() {
int num1;
scanf(" %d",&num1);
num1=verificate(num1,MIN,MAX);
printf("Number = %d",num1);
}

У меня проблема, если пользователь вставляет большее число (num1>2147483647) автоматически приводит к результату 1410065407, а также, если пользователь автоматически вводит наибольшее отрицательное значение (num1=-999999999999), результат равен -1215752191. Есть ли способ, которым я могу это контролировать? И заставить пользователя снова вставить значение?

1 Ответ

1 голос
/ 20 апреля 2020

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);
  } 
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...