【问题标题】:Argument type differentiate in C programC程序中的参数类型区分
【发布时间】:2012-12-22 08:39:14
【问题描述】:

我有一个主函数,

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

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

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

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

问题是,当argv[1] 不可用时,它的行为就像INTEGER 值作为argv[1]

如果argvINT 类型,我如何检查,不要进入argv[1]IP-ADDRESS 类型只允许在argv[1] 中使用?

【问题讨论】:

  • 为什么不将空值作为 argv[1] 传递?示例:./yourexe '' int_value

标签: c command-line-arguments argv argc


【解决方案1】:

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

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

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

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

【讨论】:

    【解决方案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
    

    【讨论】:

      【解决方案3】:

      传递给主函数的 char **argv 变量不仅仅是一个“arguments”数组,它是一个 char* 数组,只包含您在外壳。

      例如,使用 ./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 中的字符串,以便按照您想要的方式处理它们。

      【讨论】:

        【解决方案4】:

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

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

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2011-06-08
          • 1970-01-01
          • 2018-12-30
          • 2022-11-15
          • 1970-01-01
          • 1970-01-01
          • 2020-05-23
          • 2020-02-28
          相关资源
          最近更新 更多