在C中使用argv [1]上的atoi()时算术溢出

时间:2014-02-18 16:59:30

标签: c buffer flags argv atoi

我正在使用atoi(argv[1])以下是我的代码片段

void main(int argc, char* argv[])
{

    int evenOrOdd = 0;
    int inputtedNum = 0;

    pid_t  pid;
    int    i;
    char   buf[BUF_SIZE];

    if (argc != 2)//make sure user has input correctly entered
    {
        printf("Please use input: ./a.out #\n");
    }
    else
    {
        inputtedNum = atoi(argv[1]);
        if(inputtedNum < 0) //make sure number is positive
        {
            printf("Please use a positive number.\n");
            return;
        }
    }
    // ...
}

代码还在继续,但是当输入一些数字时,它有时会认为它们是负面的。如果我输入123456789它将没有问题并正确运行程序。如果我输入12345678910它会认为该数字是负数。我在这里遇到一些缓冲区错误到负标志触发器的位置?我不太确定如何解决它。

感谢任何和所有帮助!

2 个答案:

答案 0 :(得分:0)

int是一个相对较窄的整数类型,也是一个带符号的类型。使用unsigned long inputtedNumstrtoul(argv[1], 0, 0)来解析数字。

答案 1 :(得分:0)

在大多数编译器中,C中支持的最大非负整数类型是64位无符号整数。

12345678910无法存储在您使用的int类型中,即使它是unsigned long

您可以通过将argv[1]中的输入字符串“划分”为两个字符串来解决此问题,当它超过8位时,在每个字符串上使用atoi,并将结果合并到{ {1}}变量。

这会将您的正范围从大约40亿扩展到最大的16位小数。

unsigned long long,致电main

readNum(argv[1])

请注意,为了打印unsigned long long readNum(const char* input) { int length = strlen(input); if (length <= 8) { return atoi(input); } else if (length <= 16) { char str1[8+1] = {0}; char str2[8+1] = {0}; memcpy(str1,input,8); memcpy(str2,input+8,length-8); return 100000000ULL*atoi(str1)+atoi(str2); } return 10000000000000000ULL; // Invalid input } ,您需要将unsigned long longprintf一起使用。