C/C++程序的命令行参数

C++程序的main函数有两个参数:

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

我以前(大学学习的时候)一直没有弄清楚这两个参数的真正目的,一直到做Linux C开发的时候,才知道,原来这两个参数就是用来提供我们在Linux的终端上执行某个命令时,携带的额外参数,例如:

$ gcc -o test test.c

在上面这个例子中,
argc == 4
argv == [“gcc”, “-o”, “test”, “test.c”]

大部分Linux程序都需要额外的参数,并且有一套约定俗成的规则,让这些参数的规范有据可循,因此,Linux系统提供了对这些参数的解析,只要在C++程序中,引入:

include <unistd.h>

就可以使用现成的函数来解析这些参数,与这方面相关的变量与方法有以下几个:

  • extern char *optarg;
  • extern int optind;
  • extern int opterr;
  • extern int optopt;
  • int getopt(int argc,char * const argv[],const char * optstring);

搞清楚这几个东西,就可以编写出一个更强壮的Linux C++程序了。

以下的例子,摘录自http://blog.csdn.net/mamong/article/details/20648575

如果看不懂,可以看例子下面的一一的注解。

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

int main(int argc, char **argv)
{
    int result;
    opterr = 0;  //使getopt不行stderr输出错误信息

    while( (result = getopt(argc, argv, "ab:c::")) != -1 )
    {
        switch(result)
        {
            case 'a':
                printf("option=a, optopt=%c, optarg=%s\n", optopt, optarg);
                break;
            case 'b':
                printf("option=b, optopt=%c, optarg=%s\n", optopt, optarg);
                break;
            case 'c':
                printf("option=c, optopt=%c, optarg=%s\n", optopt, optarg);
                break;
            case '?':
                printf("result=?, optopt=%c, optarg=%s\n", optopt, optarg);
                break;
            default:
                printf("default, result=%c\n",result);
                break;
        }
        printf("argv[%d]=%s\n", optind, argv[optind]);
    }
    printf("result=-1, optind=%d\n", optind);   //看看最后optind的位置

    for(result = optind; result < argc; result++)
        printf("-----argv[%d]=%s\n", result, argv[result]);
         //看看最后的命令行参数,看顺序是否改变了哈。
    for(result = 1; result < argc; result++)
        printf("\nat the end-----argv[%d]=%s\n", result, argv[result]);
    return 0;
}
  • 关于getopt的第三个参数:const char * optstring ,是用来指导getopt函数解析argv中的参数:(引用内容来自上面链接的博客)


    字符串optstring可以下列元素,
    1.单个字符,表示选项,
    2.单个字符后接一个冒号:表示该选项后必须跟一个参数。参数紧跟在选项后或者以空格隔开。该参数的指针赋给optarg。
    3 单个字符后跟两个冒号,表示该选项后必须跟一个参数。参数必须紧跟在选项后不能以空格隔开。该参数的指针赋给optarg。(这个特性是GNU的扩张)。

    getopt处理以’-’开头的命令行参数,如optstring=”ab:c::d::”,命令行为getopt.exe -a -b host -ckeke -d haha
    在这个命令行参数中,-a和-b等就是选项元素,去掉’-‘,a,b,c就是选项。host是b的参数,keke是c的参数。但haha并不是d的参数,因为它们中间有空格隔开。

    还要注意的是默认情况下getopt会重新排列命令行参数的顺序,所以到最后所有不包含选项的命令行参数都排到最后。
    如getopt.exe -a ima -b host -ckeke -d haha, 都最后命令行参数的顺序是: -a -b host -ckeke -d ima haha
    如果optstring中的字符串以’+’加号开头或者环境变量POSIXLY_CORRE被设置。那么一遇到不包含选项的命令行参数,getopt就会停止,返回-1。

    有关这方面的内容,就解释到这里。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值