【问题标题】:Function getopt in C with char*const* pointerC中的函数getopt与char * const *指针
【发布时间】:2021-08-18 07:35:45
【问题描述】:

我想让第三个参数成为可能,如下所示: (像这样的任何位置的文件名)

program -a 3 <filename> -b 6
program -a 3 -b 6 <filename>

如何使用getopt 执行此操作并将此字符串保存在变量file 中?

int main(int argc, char *const *argv) {

   int a = 0;   int b = 0; int i = 0;  
   char *A;     char *B;
   char *file = NULL;

   int c;opterr = 0; 
  
   while ((c = getopt (argc, argv, "a:b:")) != -1)  {
     switch (c) {

       case 'a': a = 1; A = optarg; break;
       case 'b': b = 1; B = optarg; break;

       case '?': 
         if (optopt == 'c')             fprintf (stderr, "Option -%c requires an argument.", optopt);
         else if (isprint (optopt))     fprintf (stderr, "Unknown option `-%c'.", optopt);
         else                           fprintf (stderr,"Unknown option character `\\x%x'.",optopt);

       default: file = optarg; break; }}

   
   strcpy(&file,*(argv + i));

  return 0;
}

【问题讨论】:

  • 因为file是一个指针,那么&amp;file是一个指向指针(类型为char **)的指针。这不是strcpy 所期望的。您需要将指针传递给已分配数组的第一个元素。到处都有大量关于strcpy 的文档。包括在每一本体面的教科书中,你应该阅读。
  • 注意getopt()的GNU版本支持你想要的,除非你在环境中设置POSIXLY_CORRECT或者以+符号开始选项字符串。但是,由 POSIX 标准化的 getopt() 版本不会对参数进行这种排列(或将加号开头的选项字符串识别为特殊的)。 C 标准对 getopt() 保持沉默。

标签: c getopt


【解决方案1】:

getopt 函数要求所有参数都在所有非参数之前。因此,getopt 无法处理 program -a 3 &lt;filename&gt; -b 6。文件名必须在末尾,或者必须有一个与之关联的选项字母。

关于读取文件名,您将在 getopt 循环之后进行。 optind 变量包含下一个尚未处理的参数的索引,因此可以从 argc 中减去该值,然后将其添加到 argv 以处理从 0 开始的剩余参数。

argc -= optind;
argv += optind;
file = argv[0];

【讨论】:

    猜你喜欢
    • 2016-06-10
    • 2021-11-26
    • 1970-01-01
    • 2016-06-23
    • 2013-06-12
    • 2023-03-03
    • 1970-01-01
    • 2010-12-14
    • 1970-01-01
    相关资源
    最近更新 更多