0

我有一个主要功能,

int main (int argc, char **argv)
{}

我应该传递两个不同的命令行参数:

argv[1]=IP ADDRESS type
argv[2]=INTEGER type

例如,./a.out IP-ADDRESS INTEGER。我用其他一些脚本调用这个二进制文件。

问题是虽然argv[1]不可用,但它的行为类似于INTEGERvalue as argv[1]

我怎样才能检查 if argvis type INTdon't make it to the argv[1]or only IP-ADDRESStype is allowed in argv[1]

4

4 回答 4

5

传递给主函数的 char **argv 变量不仅仅是一个“参数”数组,它是一个 char* 数组,仅包含您在 shell 中键入的空终止字符串。

例如,调用你的程序./a.out 127.0.0.1 12将使 argv 如下所示:

argv[0] = "./a.out\0"

argv[1] = "127.0.0.1\0"

argv[2] = "12\0"

argv[3] = NULL

您需要编写一些代码来转换和存储 argv 中的字符串,以便以您想要的方式处理它们。

于 2013-01-08T13:30:51.823 回答
2
int main (int argc, char **argv)

更常见的表示为:

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

也就是说,argv是一个指向字符数组的指针。这些字符代表什么取决于您,但通常在命令行上调用程序时,这些字符将是零分隔的字符串。

如果用户不提供位置参数,那么也许您应该使用选项。见getopt()

例如:

#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>

/* Options:
       -i : integer argument
       -p : ip address
*/
int main (int argc, char *argv[])
{
    int option;
    int integer = 0;
    char *ip_address = NULL;

    opterr = 0;
    while ( (option=getopt(argc, argv, "i:p:")) != EOF ) {
      switch ( option ) {
        case 'i': integer = atoi(optarg);
                  break;
        case 'p': ip_address = optarg;
                  break;
        case '?': fprintf(stderr,"Unknown option %c\n", optopt);
                  exit(1);
                  break;
      }
    }

    if (integer)    printf("INTEGER: %d\n", integer);
    if (ip_address) printf("IPADDRESS: %s\n", ip_address);

    return 0;
}

样品运行:

./a.out -i 1234 -p 128.0.0.1
INTEGER: 1234
IPADDRESS: 128.0.0.1

./a.out -i 1234 
INTEGER: 1234

./a.out -p 128.0.0.1
IPADDRESS: 128.0.0.1

./a.out -p 128.0.0.1 -i 1234 
INTEGER: 1234
IPADDRESS: 128.0.0.1

./a.out -x stuff 
Unknown option x
于 2013-01-08T13:32:36.543 回答
1

实际上,argv[1] 和 argv[2] 都是 char 数组(嗯,指向以 0 结尾的 char 数组的指针,也就是 stringz)。可以告诉您该 stringz 是表示整数还是 IP 地址的唯一方法是解析它们(即将字符串转换为 IP 地址或整数)。

请记住,argv[N] 字符串的创建与存储通过命令行调用传递的参数一样多。如果用户不提供 IP-ADDRESS 参数,则不会丢失 arrgv[2],而只是 argv[1] 将成为唯一的 stringz,因为现在只有一个参数。

基本思想:它们只是字符串,用户可以在这些字符串中传递他想要的任何东西。解析字符串并确保它们有意义是您的工作。

于 2013-01-08T13:28:33.190 回答
0

argv 是一个 char* 数组,带有以空字符结尾的字符串

您可以使用 argc 获取传递给程序的参数数量。

if(argc == 3) // you program name is counted
{
   //if ip is here
}
else if (argc == 2)
{
   //// int is here
}

然后你可以检查ip是否通过。

于 2013-01-08T14:02:11.760 回答