我正在尝试使用getopt来运行两个不同的函数,具体取决于给定的参数。

int main(int argc, char **argv) {
    int i;
    int identify;
        while ((identify = getopt(argc, argv, "c:")) != -1) {
            switch (identify) {
                case 'c':
                    for (i = 2; i < argc; i++) {
                        readerC(argv[i]);
                    }
                default:
                    for (i = 2; i < argc; i++) {
                        reader(argv[i]);
                    }
            }
        }
    return(0);
}


目的是,如果命令包含“ -c”,则它将运行“ readerC”功能。如果没有传递任何参数,则它将读取“阅读器”功能。

我已经多次修改了上面的函数,但是在不带参数(没有输出)的情况​​下运行命令时,我似乎无法运行“阅读器”函数。以前,放入-c会根据需要运行readerC命令,但是在弄乱它之后,它现在先运行readerC函数,然后再运行reader函数。

我尝试将“ default:”更改为“ case':'”和“ case'?'”,但这都不起作用。任何帮助将不胜感激 :)

最佳答案

main()程序处理选项的顺序通常是:


初始化
选项解析
做真正的工作


您应该使用getopt()处理选项,然后处理文件参数。您还需要在break语句中包含switch,因为C在个案之间不会自动中断。

因此,您可能最终得到:

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

static void reader(const char *file);
static void readerC(const char *file);

int main(int argc, char **argv)
{
    void (*function)(const char *arg) = reader;
    int opt;
    while ((opt = getopt(argc, argv, "c")) != -1)
    {
        switch (opt)
        {
        case 'c':
            function = readerC;
            break;
        default:
            fprintf(stderr, "Unrecognized option %c\n", optopt);
            exit(1);
        }
    }

    if (optind == argc)
    {
        fprintf(stderr, "Usage: %s [-c] file ...\n", argv[0]);
        exit(1);
    }

    for (int i = optind; i < argc; i++)
    {
        (*function)(argv[i]);   // The old-fashioned way
        // function(argv[i]);   // The more modern way
    }

    return(0);
}


如果您还不满意函数指针,则可以改用标志:

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

static void reader(const char *file);
static void readerC(const char *file);

int main(int argc, char **argv)
{
    int cflag = 0;
    int opt;
    while ((opt = getopt(argc, argv, "c")) != -1)
    {
        switch (opt)
        {
        case 'c':
            cflag = 1;
            break;
        default:
            fprintf(stderr, "Unrecognized option %c\n", optopt);
            exit(1);
        }
    }

    if (optind == argc)
    {
        fprintf(stderr, "Usage: %s [-c] file ...\n", argv[0]);
        exit(1);
    }

    for (int i = optind; i < argc; i++)
    {
        if (cflag)
            readerC(argv[i]);
        else
            reader(argv[i]);
    }

    return(0);
}

关于c - 使用getopt一次触发所有情况,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/35488349/

10-11 19:36