所以我完成了一个项目,我只剩下一件事了;正确处理命令行参数。我以为我已经处理了它们但显然我错了......可以有两组不同的命令行参数,这里是我所谈论的例子:./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]是不是数字。
答案 0 :(得分:3)
您应该尝试以不同方式处理命令行。
类似的东西:
./ hw34 -c" 385,280,50" balloons.ascii.pgm balloonCircle.pgm
./ hw34 -e 100 balloons.ascii.pgm balloonEdge.pgm
然后结合getopt进行命令行处理,strtok进行参数列表的分割,你应该能够达到你想要的效果。
主要优点是您不必再担心参数的数量或它们在命令行中的位置。
答案 1 :(得分:1)
带有参数原型的Canonical 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
// ...
}
答案 2 :(得分: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");