【问题标题】:getopt() function: purpose of addition of argvgetopt() 函数:添加 argv 的目的
【发布时间】:2022-02-13 18:23:06
【问题描述】:

code piece from book

我正在阅读一本书中的getopt() 函数,并尝试制作一个接受命令行参数的程序。但是将optind添加到argv的目的是什么,以及如何将整数添加到指针数组中?完整代码:

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

int main(int argc, char *argv[]){
    char *delivery = "";
    int thick = 0;
    int count = 0;
    char ch;
    
    while((ch = getopt(argc, argv, "td:")) != EOF)
        printf("%i\n", ch);
        switch(ch){
            case 'd':
                delivery = optarg;
                break;
            case 't':
                thick = 1;
                break;
            default:
                fprintf(stderr, "Unknown option: '%s'\n", optarg);
                return 1;
    argc -= optind;
    argv += optind;
    
    if(thick)
        puts("Thick crust.");
        
    if(delivery[0])
        printf("To be delivered %s.\n", delivery);
        
    puts("Ingredients:");
    
    for(count = 0 ; count < argc ; ++count)
        puts(argv[count]);
    return 0;
}

【问题讨论】:

  • 它在书中告诉你:“最后两行确保我们跳过了我们阅读的选项”。在while 循环之后optindgetopt 发现不是选项的第一个argv 条目的索引。阅读getopt manual 了解详情。所以argv += optind 会跳过解析的选项。
  • @kaylum 但兄弟它是如何通过的?对于 ex optind=2,将 2 添加到字符串数组意味着删除数组中的前 2 个条目?
  • 不是“删除”而是“跳转到”。这就是指针算法的工作原理。如果optind2,那么argv += optind 将导致argv 指向原来的argv[2]

标签: c command-line-arguments getopt


【解决方案1】:

optind 是要在命令行上管理的下一个参数的索引。换句话说,它是迄今为止管理的参数数量。将 optind 添加到 argv 的目的是使其指向命令行上已管理的选项后面可能存在的剩余参数。因此,这些附加参数将在 argv[0], argv[1]... 直到 argv[argc - 1] 中,因为 argc 已用 选择

以下循环在命令行上显示这些附加参数:

for(count = 0 ; count < argc ; ++count)
        puts(argv[count]);

如果您不将 optind 添加到 argv 并且不使用它减少 argc,则之前的循环将是:

for(count = optind ; count < argc ; ++count)
        puts(argv[count]);

N.B.:由于 argvchar * 上的指针,因此向其添加诸如 optind 之类的值会使它增加 "optind x sizeof(char *)"

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-14
    • 1970-01-01
    • 2013-04-04
    • 1970-01-01
    • 2015-09-18
    • 2020-07-18
    相关资源
    最近更新 更多