C - Проверьте, что int, читаемый scanf, находится в диапазоне целых чисел. - PullRequest
1 голос
/ 25 февраля 2012

У меня есть этот код, который читает целое число, используя scanf, и проверяет, является ли оно целым числом, просматривая буфер.

int e_1; 
char c[1];
// noNeedToCleanBuffer is used to avoid buffer cleaning the first time.
int noNeedToCleanBuffer = 1;
do {
    // Clears the buffer.
    if (!noNeedToCleanBuffer)
        while ((c[0] = getchar()) != '\n') ;

    noNeedToCleanBuffer = 0;
    printf("Input an integer value: \n");
    e_1 = scanf("%d", &n);  

    c[0] = getchar();
} while ((e_1 != 1 && c[0] != 10) || (e_1 == 1 && c[0] != 10));

Однако я не могу понять, как проверить, находится ли ввод между INT_MIN и INT_MAX (я получаю это из limit.h).

Я думал о том, чтобы получить число в виде строки и сравнить его с двумя строками, которые будут представлять INT_MIN и INT_MAX, но, поскольку я использую стандарт c99, мне не разрешено использовать atoi () или itoa ().

Ответы [ 3 ]

1 голос
/ 25 февраля 2012

Используйте s спецификатор преобразования с scanf для чтения строки и используйте функцию strtol для проверки числа.

  • strtol позволяет сначала проверить, имеет ли число правильный формат (целое число) и может ли оно быть представлено как long целое число
  • Затем убедитесь, что число long находится между INT_MIN и INT_MAX.
1 голос
/ 25 февраля 2012

Если вы действительно хотите проверить это -

1.) Хранить в long и затем проверять

2.) Сохраните число в строке, затем преобразуйте INT_MAX в строку, получая каждую цифру и сохраняя в строке, а затем используя strcmp ()

num = INT_MAX;
i = 0;

while(num != 0){
    str[i] = num % 10;
    num = num / 10;
    i++;
}

Число в этой строке будет противоположным, его можно довольно просто перевернуть простым циклом

Затем используйте strcmp ();

0 голосов
/ 25 февраля 2012

Значение переменной любого типа данных (включая int) всегда будет в пределах диапазона этого типа данных.Это определяется и обеспечивается платформой, для которой компилируется приложение.

Если вы просто хотите выполнить «доказательство» того, что переменная находится в пределах вашего типа, вы должны привести еек переменной такого типа, которая может вместить больший диапазон значений.Например:

int foo = /* some value to test */;
long bar = (long)foo;

if ( (bar < (long)INT_MIN) || (bar > (long)INT_MAX) ) return false;
...