使用strtol过滤错误的命令提示并打印错误消息(C)

时间:2015-02-03 02:54:51

标签: c warnings strtol

所以我编译程序并像./beetle int int一样运行它,基本上是可执行文件和2个int符号,我想测试是否在可执行文件之后有超过2个参数,如果有一个参数是不是一个int(如300b),如果有一个参数是一个浮点数,而不是一个int,如果参数溢出

我坚持如何对非整数和溢出进行测试,有人能指出我正确的方向吗?

   #include <stdio.h>
#include <stdlib.h>
#include <math.h>
#define PI 3.14159265
void beetleSimulation(int, int);


int main ( int argc, char *argv[] )
{
    char * pEnd;
    if ( argc != 3 ) // argc should be 2 for correct execution 
    {
        // If the number of arguments is not 2
        fprintf(stderr, "Error: Program has %d arguments ", argc);
        return 0;
    }
    else 
    {
       //run the beetle simulation
        beetleSimulation(strtol(argv[1], &pEnd, 10), strtol(argv[2], &pEnd, 10 ));
        if (!*pEnd)
            printf("Success!");
        else
            printf("Failed!");
        return 0;
        }
    }


void beetleSimulation(int size, int iterations){
    int i;
    double xCount;
    double yCount;
    int timeCount;
    int overallCount = 0;
    int degree;
    double radian;
    int border;
    for(i=0; i < iterations; i++){
        xCount = 0;
        yCount = 0;
        timeCount = 0;
        border -= size;
        while(xCount < size && xCount > border  && yCount <size && yCount >border ){
            timeCount += 1;
            degree = rand() % 360;
            radian = degree / (180 * PI);

            xCount += sin(radian);
            yCount += cos(radian);
            printf("Radian is %f\n", radian);

            printf("X and Y are %f and %f\n", xCount, yCount);
        }

        //when beetle has died, add time it took to overall count, then go through for loop again
        overallCount += timeCount;
        printf("Time for this run is %d, overall its %d\n",timeCount, overallCount);
    }
    //calculate average time
    double averageTime = overallCount/iterations;
    printf("Average Time is %f",averageTime);
}

2 个答案:

答案 0 :(得分:0)

转换为int转换函数的字符串。

bool str2int(const char *s, int *dest) {
    char *endptr;
    errno = 0;
    long lnum = strtol(s, &endptr, 10);
    if (s == endptr) return 1;                               // fail - no conversion
    if (*endptr) return 1;                                   // fail - extra garbage
    if (errno || lnum < INT_MIN || lnum > INT_MAX) return 1; // fail - overflow
    *dest = (int) lnum;
    return 0; // success
  }

答案 1 :(得分:0)

建议获取argv [x]

的strlen()值

然后执行strtol()调用

然后将argv [x] + strlen()值与strtol()的第二个参数中设置的值进行比较

如果匹配,则参数是一个好的int,

另一方面,这个论点(可能)不是一个好的。

建议在调用beetleSimulation()之前进行所有这些比较

因为对strtol()的两次调用都使用相同的变量作为结束地址,所以第二次调用strtol()会掩盖第一次调用中设置的值。