Я пытаюсь обработать целочисленное переполнение. Мой код:
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<errno.h>
#include<limits.h>
int isInt (char *s)
{
char *ep = NULL;
long i = strtol (s, &ep, 10);
if ((*ep == 0) || (!strcmp(ep,"\n")))
return 1; // it's an int
return 0;
}
int main()
{
char *buffer = NULL;
size_t count = 0;
ssize_t ret;
//AMINO *a_acid;
int num;
for(;;)
{
printf("Please enter an integer:");
if((ret = getline(&buffer, &count, stdin)) < 0)
{
perror("getline: error\n");
free(buffer);
exit(EXIT_FAILURE);
}
if(!isInt(buffer))
{
perror("you are not entering int , Try again:");
continue;
}
sscanf(buffer, "%d",&num);
printf("%d\n", num);
if ((num > INT_MAX)|| (num < 0))
{
perror("you overflowed int variable , Try again:\n ");
continue;
}
break;
}
}
Теперь я проверял, как реагирует этот код. И я увидел что-то странное. Когда я ввожу такое большое число, оно обнаруживается. Но иногда это не обнаруживается.
Вот мой вид терминала:
> nazmul@nazmul-Lenovo-G50-80:~/2nd_sem/biophysics$ gcc torson.c
> nazmul@nazmul-Lenovo-G50-80:~/2nd_sem/biophysics$ ./a.out
> Please enter an integer:ksdjfjklh
> you are not entering int , Try again:: Success
> Please enter an integer:338479759475637465765
> -1
> you overflowed int variable , Try again: : Numerical result out of
> range
> Please enter an integer:58678946895785
> 1103697833
> nazmul@nazmul-Lenovo-G50-80:~/2nd_sem/biophysics$
* Почему это работает для этого числа 338479759475637465765. Но это не работает для 58678946895785. Логика, которую я использовал в моей программе, это когда она выходит за пределы, тогда переменная int дает некоторое -1 или отрицательное значение. Я прочитал много статей, до сих пор это не совсем понятно.