webbench学习之getopt_long,atio

来源:互联网 发布:网络维护培训学校 编辑:程序博客网 时间:2024/05/22 06:57


webben在main函数中使用了getopt_long函数获得main函数的输入参数,可以看到文档中的参数定义

int getopt(int argc, char * const argv[], const char *optstring);

 int getopt_long(int argc, char * const argv[], const char *optstring, const struct option *longopts, int *longindex);

 getopt 和 getopt_long的区别在于getopt_long比getopt函数多两个参数,首先介绍getopt函数的三个参数定义:

argc 和argv就main函数的输入,optstring 是用户自定义的字符串,下面举例说明


   int main(int argc, char *argv[])   {           int opt;           while((opt=getopt(argc, argv, "c:d:e:"))!=EOF)          {                  printf("opt is %c",opt);                 printf("\n optarg %s",optarg);                  printf("\n optind %d", optind);                  printf("\n optargv[] %s", argv[optind-1]);          } }

"c:d:e:"时,getopt函数依次检查输入中是否有-c -d -e,:的意思是在这些参数后面有其他的输入,如-c 100 -d 200 -e 300

函数输出

[gaowei@iZ28n8zvqheZ ctest]$ ./a.out -c 100 -d 200 -e 300opt is c optarg 100 optind 3 optargv[] 100opt is d optarg 200 optind 5 optargv[] 200opt is e optarg 300 optind 7 optargv[] 300


getopt_long函数的longopts的参数是一个 struct option 的结构体,结构体定义

 struct option {
               const char *name;
               int         has_arg;
               int        *flag;
               int         val;
           };

       name  是参数的名称

       has_arg 指明是否带参数值,其数值可选:
              no_argument (即 0) 表明这个长参数不带参数(即不带数值,如:--name)
              required_argument (即 1) 表明这个长参数必须带参数(即必须带数值,如:--name Bob)
            optional_argument(即2)表明这个长参数后面带的参数是可选的,(即--name和--name Bob均可)

       flag   当这个指针为空的时候,函数直接将val的数值从getopt_long的返回值返回出去,当它非空时,val的值会被赋到flag指向的整型数中,而函数返回值为0

       val    用于指定函数找到该选项时的返回值,或者当flag非空时指定flag指向的数据的值。

webbench程序中的定义为

static const struct option long_options[]={ {"force",no_argument,&force,1}, {"reload",no_argument,&force_reload,1}, {"time",required_argument,NULL,'t'}, {"help",no_argument,NULL,'?'}, {"http09",no_argument,NULL,'9'}, {"http10",no_argument,NULL,'1'}, {"http11",no_argument,NULL,'2'}, {"get",no_argument,&method,METHOD_GET}, {"head",no_argument,&method,METHOD_HEAD}, {"options",no_argument,&method,METHOD_OPTIONS}, {"trace",no_argument,&method,METHOD_TRACE}, {"version",no_argument,NULL,'V'}, {"proxy",required_argument,NULL,'p'}, {"clients",required_argument,NULL,'c'}, {NULL,0,NULL,0}};

另一个参数longindex,如果longindex非空,它指向的变量将记录当前找到参数符合longopts里的第几个元素的描述,即是longopts的下标值。

综上所述,webbench程序在进入main函数后就判断了main函数的参数

 while((opt=getopt_long(argc,argv,"912Vfrt:p:c:?h",long_options,&options_index))!=EOF ) {  switch(opt)  {   case  0 : break;   case 'f': force=1;break;   case 'r': force_reload=1;break;    case '9': http10=0;break;   case '1': http10=1;break;   case '2': http10=2;break;   case 'V': printf(PROGRAM_VERSION"\n");exit(0);   case 't': benchtime=atoi(optarg);break;        case 'p':      /* proxy server parsing server:port */     tmp=strrchr(optarg,':');     proxyhost=optarg;     if(tmp==NULL)     {     break;     }     if(tmp==optarg)     {     fprintf(stderr,"Error in option --proxy %s: Missing hostname.\n",optarg);     return 2;     }     if(tmp==optarg+strlen(optarg)-1)     {     fprintf(stderr,"Error in option --proxy %s Port number is missing.\n",optarg);     return 2;     }     *tmp='\0';     proxyport=atoi(tmp+1);break;   case ':':   case 'h':   case '?': usage();return 2;break;   case 'c': clients=atoi(optarg);break;  } } 

如果读入的opt为c 或者 t时,使用atoi函数,将读入的字符串转换成整数赋值给变量。


  函数功能就是将数字表示的字符串转换成整数,识别的数字是从字符串起始位置到第一位非数字字符。


int main(){        char *p = "123.456";         int x = atoi(p);         printf("%d",x);}      

输出为:

123




0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 店铺被低价拍了一部分商品该怎么办 淘宝买家退货快递单号填错了怎么办 卖家同意退款了买家不退货怎么办 淘宝代购衣服有破损不给退怎么办 网上购飞机票身份证号写错了怎么办 交易猫买家把我号清了怎么办 光大普卡额度4万封顶了怎么办 天天特价通过后价格设置错误怎么办 苏宁易购不小心点了免密支付怎么办 别人知道自己京东的账号密码怎么办 oppo手机刷机要锁屏密码怎么办 在苏宁易购退款成功又收到货怎么办 今日头条转发出现未安装微信怎么办 打开手机后自动弹出广告怎么办去除 朋友圈发广告被腾讯屏蔽了怎么办 新商盟手机订烟登录密码忘了怎么办 手机版战神斯巴达幽灵经常崩怎么办 代购买的东西被海关扣了怎么办 托朋友代购给了钱联系不上人怎么办 签了合同被加盟商骗了怎么办 百度云盘下载时本地空间不足怎么办 百度云盘隐私空间没密码忘了怎么办 华为云空间的帐号密码忘记了怎么办 快递被快递公司弄丢了怎么办 快递到了人不在那个地方了怎么办 微信被骗了1千多怎么办 客户货已经用啦要求退款退货怎么办 网购收到别人退货的东西怎么办 好省输入订单编号查不到订单怎么办 快递没有当面验收后发现损坏怎么办 支付宝电脑付款风控异常怎么办 京东买东西地址填错了怎么办 商场卖的衣服跟官网差价大怎么办 网购的衣服有好几个破洞怎么办 出租发票有牌号是假的怎么办 支付宝里的多收多保被降级了怎么办 超市购物卡余额与实际不符怎么办 发广告的公众号无法取消关注怎么办 扣扣需要手机验证码登录怎么办 驾校报了联系不了教练了怎么办 手机号被别人注册了百度网盘怎么办