首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >可选getopt函数

可选getopt函数
EN

Stack Overflow用户
提问于 2014-11-05 07:58:04
回答 2查看 1.7K关注 0票数 1

我很难让getopt操作可选。这是我代码的一部分。它接受一个参数文件,如果它在那里,它会计数字符的数量。如果没有,则对stdinput字符进行计数。

我的问题是,在未声明的情况下,optarg会被设置为什么?以及如何使我的选项-c可选,并使这一工作。

目前,它总是从stdin读取。

代码语言:javascript
复制
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;
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-11-05 08:06:38

选项的可选参数不受“标准”(POSIX) getopt()的支持。双冒号"::"的使用是一个getopt()扩展。

要让getopt()optarg设置为选项的“可选”参数,请在调用程序时使用以下选项:

代码语言:javascript
复制
program -coptional_argument_to_option_c

但是,您也可以采取下列方法之一:

  • 定义-c filename,文件名是强制性的。如果-c filename漏掉了,只需数一数从stdin读取的内容。
  • 或者定义没有参数的-c,告诉您的程序要做什么,(在这里计数),并另外定义一个选项,告诉您的程序读取的位置,比如-f filename。如果后者没有读到stdin的话。
票数 1
EN

Stack Overflow用户

发布于 2015-10-27 14:02:45

我在getopt手册中找到了这个:

两个冒号表示一个选项接受一个可选的arg;如果当前argv-元素中有文本(例如,在选项名称本身的同一个单词中,例如"-oarg"),那么它将在optarg中返回,否则optarg被设置为零。

long

这一页解释得更好一些:

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

最后,如果optstring中的选项字母后面跟着两个冒号,则该选项允许具有可选选项参数。(说得快三次!)如果这样的论点与选项在同一个argv元素中,则被认为是存在的,否则就不存在了。在不存在的情况下,getopt()返回选项字母并将optarg设置为NULL。例如,考虑到-

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

-for -bYANKEES,返回值是'b',optarg指向“扬基队”,而对于-b或'-b扬基队‘,返回值仍然是'b’,但optarg设置为空。在后一种情况下,“北方佬”是一个单独的命令行论点。

看看这个是否也适用于你。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26752185

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档