【发布时间】:2019-01-19 14:29:44
【问题描述】:
我正在尝试处理整数溢出。我的代码是:
#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 或负值。看了很多文章,还是不太清楚。
【问题讨论】:
-
忽略该行。我将一些代码从 isfloat() 编辑到 isInt()
-
perror()的第二次和第三次使用没有意义。我 -
另外请花点时间正确缩进代码。
-
num > INT_MAX永远不会是真的。由于num是int,它的值永远不会大于INT_MAX。可能发生的情况是,当您输入一个大数字时,scanf内部发生了溢出(这可能是 C 标准未定义的行为;我没有检查这一点),结果是放置了一个负值在int。然后这触发了你的测试num < 0。