2014-03-12 109 views
0

因此,我正在完成一个项目,只剩下一件事情要做,正确处理命令行参数。我以为我让他们处理,但显然我错了...可以有两组不同的命令行参数可以进来,这里是我所说的例子:./hw34 -c 385 280 50 balloons.ascii.pgm balloonCircle.pgm./hw34 -e 100 balloons.ascii.pgm balloonEdge.pgm处理特定的命令行参数

这是我曾试图处理这些参数,但是这似乎并没有工作: if(argc==5) && isdigit(atoi(argv[2]))){else if(argc==7 && isdigit(atoi(argv[2])) && isdigit(atoi(argv[3])) && isdigit(atoi(argv[4]))){

什么我卡在试图找出如果的argv [X]是数字或没有。

回答

3

你应该尝试以不同的方式处理命令行。

喜欢的东西:

./hw34 -c “385,280,50” balloons.ascii.pgm balloonCircle.pgm

./hw34 -e 100 balloons.ascii.pgm balloonEdge.pgm

然后结合getopt进行命令行处理,并将strtok与参数列表的拆分组合在一起,您应该可以实现您想要的功能。

主要优点是您不必担心命令行中参数的数量或位置。

+0

谢谢,我会试试这个 – kevorski

1

典型main function带参数的原型是

int main(int argc, char* argv[]); 

argc哪里是参数char* argv[]的数量, - 这些参数的字符串数组。数组的第一个元素 - argv[0] - 是程序的名称。

要检查参数是一个数字就可以使用它返回转换的状态与strtol功能:

char* tail; 
long n = strtol(argv[2], &tail, 10); // 10 is the base of the conversion 

然后一个号码后检查它指向该字符串的部分的尾部(如果有的话) :

if (tail == argv[2]) { // not a number 
    // ... 
} else if (*tail != 0) { // starts with a number but has additional chars 
    // ... 
} else { // a number, OK 
    // ... 
} 
+0

我明白,但无论如何检查,看看他们是否是数字。 – kevorski

1

argv的阵列。没有整数。

您可以轻松地测试,如果转化率可以通过使用strtol,然后检查是否所有字符都消耗:

char const * str = "123"; 
char * endptr; 
long number = strtol(str, &endptr, 0); // do the conversion to long integer 
if(&str[strlen(str)] == endptr) // endptr should point at the end of original string 
    printf("ok"); 
else 
    printf("error");