C语言命令行参数

执行程序时,可以从命令行传值给 C 程序。这些值被称为命令行参数,它们对程序很重要,特别是当您想从外部控制程序,而不是在代码内对这些值进行硬编码时,就显得尤为重要了。

命令行参数

命令行参数是使用 main() 函数参数来处理的,其中,argc 是指传入参数的个数,argv[] 是一个指针数组,指向传递给程序的每个参数。下面是一个简单的实例:

#include<stdio.h>

int main(int argc,char *argv[])
{
    printf("Total arg num:%d",argc);
    printf("argv[0]:%s",argv[0]);
    if(argc>=2)
    {
        printf("argv[1]:%s",argv[1]);
    }

    return 0;
}

命令行参数中,char *argv[]也可以用char **argv替代。其中,argv[0]将保存存储函数的名称,argv[1]才是你实际输入的第一个参数。如果没有提供任何参数,argc 将为 1,否则,如果传递了一个参数,argc 将被设置为 2。
多个命令行参数之间用空格分隔,但是如果参数本身带有空格,那么传递参数的时候应把参数放置在双引号 “” 或单引号 ” 内部。
如,若想传递两个参数test1,test2给可执行程序a.out,则输入执行命令为

./a.out test1 test2

而若要传递一个带有空格的参数test1 test2,则应输入

./a.out "test1 test2"

getopt函数

getopt()用来分析命令行参数。函数原型如下:

#include<unistd.h>
int getopt(int argc,char * const argv[],const char * optstring);
//成功,将传入参数赋给全局变量optarg;若参数中没有可识别的选项,返回-1

参数argc和argv分别代表参数个数和内容,跟main()函数的命令行参数是一样的。参数 optstring为选项字符串, 告知 getopt()可以处理哪个选项以及哪个选项需要参数。
并有以下全局变量:

extern char *optarg;
extern int optind, opterr, optopt;

optarg:指向当前选项参数(如果有)的指针。
optind:再次调用 getopt() 时的下一个 argv 指针的索引。
opterr:这个变量非零时,getopt()函数为“无效选项”和“缺少参数选项,并输出其错误信息。
optopt:最后一个未知选项。

对于optstring中的指定内容,有以下规定:
getopt(argc, argv, "ab:c:de::");为例
1)单个字符,表示选项(如下例中的abcde各为一个选项)
2)如果选项字符串里的字母后接着冒号“:”,则表示还有相关的参数,参数紧跟在选项后或者以空格隔开。该参数的指针赋给optarg。
3)单个字符后跟两个冒号,表示该选项后可以跟一个参数,也可以不跟。如果跟一个参数,参数必须紧跟在选项后不能以空格隔开。该参数的指针赋给optarg。(如上例中的e::,如果没有跟参数,则optarg = NULL)。
4)如果在处理期间遇到了不符合optstring指定的其他选项,getopt()将显示一个错误消息,并将全局变量optarg设为“?”字符,如果不希望getopt()打印出错信息,则只要将全域变量opterr设为0即可。

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

int main(int argc, char *argv[])
{
  int ch;
  //opterr = 0;//将opterr设置为0,这样就可以在getopt()函数发现错误的时候强制它不输出任何消息。
  while((ch = getopt(argc,argv,"a:bcde"))!= -1)
  {
    switch(ch)
    {
        case 'a': 
            {   
                printf("option a:’%s’\n",optarg);
                break;
            }
        case 'b': 
            {
                printf("option b :b\n"); 
                break;
            }
         case '?'//当命令行输入参数无效或者没有输入时,且opterr没有设定为0时,会打印以下信息
            {
                printf("argument error\n");
                break;
            }
        default: 
                ;
    }
  }
    return 0;
}

参考:
http://blog.csdn.net/mr_jj_lian/article/details/6835137
https://baike.baidu.com/item/getopt/4705064?fr=aladdin

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值