【问题标题】:Keeping track of several multiple arguments with C getopt使用 C getopt 跟踪多个参数
【发布时间】:2017-12-02 16:45:05
【问题描述】:

我的问题基于上一个问题,询问 C optget 如何处理多个值:C getopt multiple value

就我而言,我只有一个参数-i,这是可选的。用户必须使用此语法:

/a.out -i file1 -i file2 -i file3

如果用户不提供-i 标志,程序运行正常。用户可以提供无限数量的文件作为可选参数,例如

/a.out -i file1 -i file2 -i file3 -i file4 -i file5 ...

我从getopt()main() 中的这个 getopt()while 语句开始:

char *input;  // ?? Now syntactically correct, but uninitialized?

while ((opt = getopt(argc, argv, "i:"))!= -1){
    case 'i':
        if (optarg == NULL){
            input = NULL;
            } 
        else{
            strcpy(input, optarg);
            break;
  ...
}

然后我会将这些可选参数传递给函数:

function1(char *required_arg, ...)

在上述情况下,它将是:

function1(required_arg, file1, file2, file3, file4, file5)

目前,我将input 定义为“文件”。我的问题是,我如何跟踪任意数量的可选参数以便以后传递给函数?上面的代码是错误的,因为我正在为每个传递的-i 参数重新定义input

人们使用什么数据结构?

【问题讨论】:

  • 你可以传递一个参数数组(你可以将它们存储在一个数组中)
  • @coderredoc 我如何计算通过i 传递的参数的长度?也就是上面有5个文件
  • 如果我错了,请纠正我 - 您想获取从选项 -i file1 -i file2 获得的文件的名称,然后您想将它们传递给其他方法。现在您的问题是如何将它们传递给其他方法?
  • @coderredoc 是的。也许我误解了optget() 上面的工作原理,但我认为我需要保存每个字符串(例如通过附加到数组),然后遍历这个数组,将字符串输入function1
  • 可能还有其他方法 - 但将其存储在数组中就是其中之一。同样,如果您将它存储在一个数组中 - 为什么不能将整个数组传递给方法function1?现在,如果该方法一次只接受一个字符串 - 那么当您在while 循环中一一获取选项时,为什么不能一一传递参数?

标签: c arguments


【解决方案1】:

我建议的解决方案是将文件名传递到数组中。该解决方案假定最大文件数为 10,最大文件名长度为 30。但类似地,我们可以提供允许任意数量文件的动态分配机会。

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

#define MAXLEN 30
#define MAXFILECOUNT 10
void print(int fileCount, char files[][MAXLEN+1]){
    for(int i = 0; i < fileCount; i++){
        printf("%s \n",files[i]);
    }
}
int main(int argc, char **argv)
{
    int opt;
    char fileName[MAXFILECOUNT][MAXLEN+1];
    int count = 0;

    while ((opt = getopt(argc, argv, "i:")) != -1)
    {
        switch (opt)
        {
        case 'i':
            snprintf(fileName[count++],MAXLEN,"%s",optarg);
            break;
        }
    }
    print(count,fileName);
    return 0;
}

像这样调用程序

./a.out -i file1 -i file2

【讨论】:

  • 感谢您的帮助。以上对我来说很有意义。但是,我仍然不明白函数function1() 将如何获取数组中的文件名并使用它们。如果函数调用是function1(required_arg, file1, file2, file3),则必须编写function1(),以便获取这些文件名并对它们进行处理。我的问题有意义吗?
  • @ShanZhengYang:您不能明智地编写一个函数来获取可变长度参数列表,然后使用在运行时变化的许多参数轻松调用它。想想printf();您总是固定在编译时将在调用中传递的参数的数量,并且您不能在运行时更改该数量。与execl()execlp() 类似;您不能在运行时更改变量列表中的参数数量(特别是,您不能让它增长到无限大小;有一些方法可以使用最大大小或更小)。 [...继续...]
  • [...continuation...] 如果您想要在运行时不定数量的参数,那么您可以使用数组和长度(例如,qsort()),或数组和标记(例如,execvp() — 通常,对于字符串数组或任何其他指针数组,标记是空指针)。这是建议的内容。
  • @JonathanLeffler 可能会有一些混淆 RE:“你不能在运行时更改数字” 并不是要建议在上面这样做。我想我问的是更简单的问题,即函数如何“解包”这些数组值。我想像上面print() 这样的迭代将是正确的方法。
  • @ShanZhengYang:是的,在被调用的函数内部,你会遍历数组元素。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-03-06
相关资源
最近更新 更多