当标志不在开头时,有没有办法使用 getopt ?

问题描述 投票:0回答:1

我正在编写的 C 程序将文件和标志作为参数。该程序需要支持将标志放置在参数中的任何位置。例如,“./program file1 file2 -f 10 file3 file4”。我正在尝试使用 getopt() 和 optarg 来读取标志。但如果不将标志作为第一个参数,我就无法让它工作。

如果尝试简单的

int c;
while ((c = getopt(argc, argv, "jB")) != -1)
{
    switch (c)
    {
    case 'j':
        jflag = true;
        break;
    case 'B':
        bflag = true;
        break;
    default:
    }
}

但是一旦参数不是标志,它就会停止。 我也尝试过使用强制 getopt 过去:

int opt;
int number = 1;

for (int i = 0; i < argc; i++)
{
    opt = getopt(argc, argv, "j:");
    if(opt == 'j')
    {
        number = atoi(optarg);
    }
}

我无法让它工作。 有没有办法在不将标志作为第一个参数的情况下执行此操作?

注意:忽略代码示例所做的事情略有不同的事实。所有示例均未找到任何标志。

c arguments getopt
1个回答
0
投票

我正在尝试使用 getopt() 和 optarg 来读取标志。但如果不将标志作为第一个参数,我就无法让它工作。

getopt()
没有记录在 C 语言规范中。它的 POSIX 规范规定了您观察到的行为:选项处理在第一个非选项参数处停止。

GNU

getopt()
默认情况下确实按照您想要的方式运行,但如果您不能依赖该版本,那么您可能需要在不依赖
getopt()
的情况下编写命令行处理。事实上,因为
getopt()
是非标准的(相对于语言规范),如果您需要程序具有广泛的可移植性,您可能应该完全避免它。

© www.soinside.com 2019 - 2024. All rights reserved.