尝试使用getopt解析c中的输入

Posted

技术标签:

【中文标题】尝试使用getopt解析c中的输入【英文标题】:Trying to use getopt to parse input in c 【发布时间】:2015-03-25 19:53:51 【问题描述】:

好的,所以基本上我正在寻找输入 a 和 b 之后的数字,并且我正在搜索 c 和 d,而不需要额外的信息。但是,当我尝试使用 getopt 执行此操作时,我的循环永远不会执行。下面是一些示例代码:

int aa = 0;

int av = 0;

int ab = 0;

int bv = 0;

int ac = 0;

int cord = 0;// no c or d = 0, c = 1, d = 2

//flags and a/b value holders

int getoptvalue = 0;

printf("starting getopt\n");

while((getoptvalue = getopt(argc,argv,"cda:b:")) != -1)

printf("inside getopt\n");

  switch(getoptvalue)

  case a:if(aa||ab)

         exit(1);

         

         else

         aa = 1;

         av = atoi(optarg);//takes int value following 'a' for storage in av?

         break;

  case b:if(ab)

         exit(1);

         

         else

         ab = 1;

         bv = atoi(optarg);//takes following int value for storage?

         break;

  case c:if(ac)

         exit(1);

         

         else

         ac = 1;//c/d switch

         cord = 1; // showing c was reached

         break;

  case d:if(ac)

         exit(1);

         

         else

         ac = 1;

         cord = 2; //showing d was reached

         break;

  default: break;

  

printf("done.\n");


编译后,此代码打印:

$prog1 a1 b2 开始 getopt 完成。

它显然没有运行循环,因为它从不打印“内部 getopt”,但我不知道为什么。有什么想法吗?

【问题讨论】:

如果我遗漏了什么,我很抱歉,但是是case a 还是case 'a' default: break; default 的情况 嗯,我不太确定,但您是否尝试过类似 $prog1 -a 1 -b 2 的特定顺序? 在开关中省略默认值是您与下一个人的意图的风格/沟通问题。 原来是输入参数。谢谢! 【参考方案1】:

我已经修改了你的代码,现在看起来像这样

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

int main(int argc,char* argv[]) 
int aa = 0;

int av = 0;

int ab = 0;

int bv = 0;

int ac = 0;

int cord = 0;// no c or d = 0, c = 1, d = 2

//flags and a/b value holders

int getoptvalue = 0;

printf("starting getopt\n");

while((getoptvalue = getopt(argc,argv,"cda:b:")) != -1)

printf("inside getopt\n");

  switch(getoptvalue)

  case 'a':if(aa||ab)

         exit(1);

         

         else

         aa = 1;

         av = atoi(optarg);//takes int value following 'a' for storage in av?

         break;

  case 'b':if(ab)

         exit(1);

         

         else

         ab = 1;

         bv = atoi(optarg);//takes following int value for storage?

         break;

  case 'c':if(ac)

         exit(1);

         

         else

         ac = 1;//c/d switch

         cord = 1; // showing c was reached

         break;

  case 'd':if(ac)

         exit(1);

         

         else

         ac = 1;

         cord = 2; //showing d was reached

         break;

  default: break;

  

printf("done.\n");


return 0;

现在当我编译这段代码并按以下方式运行时

gcc test.c
./a.out -a a -b b
starting getopt
inside getopt
done.
inside getopt
done.
inside getopt

【讨论】:

以上是关于尝试使用getopt解析c中的输入的主要内容,如果未能解决你的问题,请参考以下文章

C命令行参数解析——getoptgetopt_long及getopt_long_only

使用getopts处理shell中的输入参数

Python3+getopt解析命令行参数

Perl模块 Getopt::Long 解析

『Argparse』命令行解析

『Argparse』命令行解析