0

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

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

   #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);
}
4

2 回答 2

0

建议获取 argv[x] 的 strlen() 值

然后执行 strtol() 调用

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

如果它们匹配,那么参数是一个很好的 int,

否则,该论点(可能)不是一个好的int。

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

由于对 strtol() 的两次调用都使用相同的变量作为结束地址,因此对 strtol() 的第二次调用将屏蔽第一次调用中设置的值。

于 2015-02-03T03:24:29.900 回答
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
  }
于 2015-02-03T03:14:03.450 回答