2014-11-05 68 views
0

我很难让getopt操作可选。这是我的代码的一部分。它需要一个参数文件,如果它在那里,它会计算字符的数量。如果不是,则计数stdinput字符。可选的getopt函数

我的问题是什么optarg一旦它是未申报设置?我怎么去做我的选项-c可选,并使其工作。

目前它总是从标准输入读取。

while((option = getopt(argc, argv, "c::")) != -1) { 
    switch(option) { 
    case 'c': 
    if (optarg == NULL) { 
     file = stdin; 
     } 
    else { 
     file = fopen(optarg, "r"); 
    } 
    while((ch = fgetc(file)) != EOF) { 
     count++; 
    } 
    printf("%d %s\n", count, optarg); 
    fclose(file); 
    break; 
+2

“什么'optarg'设置为一旦它是未申报”???你不可能比这更不清楚。 – 2014-11-05 08:05:28

+0

为什么'::',而不是':'? – alk 2014-11-05 08:17:55

+0

“两个冒号意味着一个选项需要一个可选的参数” - linuxmanual – Sarc 2014-11-05 08:21:55

回答

1

“Standard”(POSIX)getopt()不支持选项的可选参数。使用双冒号"::"GNU getopt()的扩展名。

要有getopt()设置optarg一个选项的“可选”的说法使用该选项上调用这样的程序:

program -coptional_argument_to_option_c 

但是另外,你可能想采取的下列方法之一:

  • 被人定义-c filename datory。并且如果-c filename错过就算从stdin读取的内容。

  • 或定义-c不带参数告诉程序做什么(这里计数),并额外定义的选项告诉程序哪里读-f filename。如果后者错过了stdin

+0

当文件名参数是强制性的(c :)时,getopt()自动指示该选项需要参数。那么我在哪里放置条件语句? – Sarc 2014-11-05 08:14:36

+0

@Sarc:哪个“*条件陈述*”? – alk 2014-11-05 08:17:03

+0

谢谢,我通过第一个选择了它 – Sarc 2014-11-05 08:33:07

0

我发现这个在getopt的手册页:

两个冒号意味着某种带有一个可选的ARG;如果当前argv元素中有文本(即与选项名称本身相同的单词,例如“-oarg”),那么它将返回optarg,否则optarg将设置为零。

http://linux.die.net/man/3/getopt_long

本页面还挺解释了它好一点:

http://www.informit.com/articles/article.aspx?p=175771&seqNum=3

最后,如果在optstring的选项字母后跟两个冒号,那么这个选项允许有一个可选选项参数。 (说快三倍!)如果这个论点与选项在相同的argv元素中,那么这个论点就被认为是存在的,否则就不存在了。如果它不存在,GNU getopt()返回选项字母并将optarg设置为NULL。例如,得到N-

while ((c = getopt(argc, argv, "ab::")) != 1) ...

- 用于-bYANKEES,返回值是 'b' 和OPTARG指向 “YANKEES”,而对于-b或 '-b YANKEES',返回值仍然是'b',但是optarg被设置为NULL。在后一种情况下,“YANKEES”是一个单独的命令行参数。

检查这是否也适用于您。