处理C/C++中的命令行标志

Fab*_*mez 13 c unix command-line-arguments

我正在寻找关于标志是什么的非常简单的解释/教程.我知道标志工作表明命令该做什么.例如:

rm -Rf test
Run Code Online (Sandbox Code Playgroud)

我知道rm命令将删除测试文件夹,并且-Rf标志将强制命令不仅删除文件夹而且删除其中的文件.

但是,标志读取/编译在哪里?处理旗帜的是什么?例如,我可以编写自己的C/C++程序并指定不同的标志,以便程序执行不同的操作吗?我希望我提出正确的问题.如果没有,请告诉我.

zwo*_*wol 12

在C级别,程序的命令行参数出现在main函数的参数中.例如,如果您编译此程序:

#include <stdio.h>
int main(int argc, char **argv)
{
    int i;
    for (i = 0; i < argc; i++)
        printf("argv[%d] = %s\n", i, argv[i]);
    return 0;
 }
Run Code Online (Sandbox Code Playgroud)

并使用与示例'rm'命令相同的参数调用它,您得到:

$ ./a.out -Rf test
argv[0] = ./a.out
argv[1] = -Rf
argv[2] = test
Run Code Online (Sandbox Code Playgroud)

如您所见,第一个条目argv是程序本身的名称,其余的数组条目是命令行参数.

操作系统完全不关心参数是什么; 由您的程序来解释它们.但是,有关于它们如何工作的惯例,其中以下是最重要的:

  • 参数分为选项非选项.选项以短划线开头,非选项不开始.
  • 顾名思义,选项应该是可选的.如果你的程序需要一些命令行参数,在所有有用的做任何事情,这些参数应该是非选项(即它们应该以破折号开始).
  • 选项可以进一步分为选项,单个短划线后跟单个字母(-r,-f)和选项,两个短划线后跟一个或多个短划线分隔的单词(--recursive,--frobnicate-the-gourds).-rf只要没有一个参数(参见下文),短选项可以拼凑成一个参数().
  • 选项本身可以采用参数.
    • 选项的参数-xargv条目的其余部分,或者如果该条目中没有其他文本,则是下一个argv条目,无论是否以短划线开头.
    • 选项的参数用等号表示:--output=outputfile.txt.
  • 如果可能的话,不同选项(带有参数)的相对排序应该没有可观察到的影响.
  • 特殊选项--意味着"不要在命令行上的这一点之后处理任何内容作为选项,即使它看起来像一个." 例如,您可以-f通过键入删除名为' ' 的文件rm -- -f.
  • 特殊选项-意味着"读取标准输入".
  • 按照惯例保留了一些简短的选项字母:最重要的是
    • -v =啰嗦
    • -q =安静
    • -h =打印一些帮助文本
    • -o file =输出到文件
    • -f =强制(不要提示确认危险行为,只是这样做)

有一堆库可以帮助您解析命令行参数.最便携,但也是最有限的是getopt,它现在在大多数系统的C库中内置.我建议您阅读GNU argp的所有文档,即使您不想使用该特定文档,因为它将进一步教育您遵守约定.

还值得一提的是,通配符扩展(rm -rf *)是调用程序之前完成的.如果你运行上面的示例程序,就像./a.out *在一个只包含二进制文件和它的源代码的目录中那样

argv[0] = ./a.out
argv[1] = a.out
argv[2] = test.c
Run Code Online (Sandbox Code Playgroud)


abe*_*nky 11

这个简单的程序应该演示传递给程序的参数(包括程序名本身).

解析,解释和使用这些参数取决于程序员(您),尽管有可用的库可以提供帮助.

int main(int argc, char* argv[])
{
    int i;
    for(i=0; i<argc; ++i)
    {   printf("Argument %d : %s\n", i, argv[i]);
    }
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

如果您将此程序编译为a.out,并将其运行为:

prompt$>  ./a.out ParamOne ParamTwo -rf x.c
Run Code Online (Sandbox Code Playgroud)

你应该看到输出:

Argument 0 : a.out
Argument 1 : ParamOne
Argument 2 : ParamTwo
Argument 3 : -rf
Argument 4 : x.c
Run Code Online (Sandbox Code Playgroud)


Xen*_*sis 6

实际上,您可以编写自己的 C++ 程序,它接受这样的命令行参数:

int main(int argc, char* argv[]){}

变量 argc 将包含参数的数量,而 char* 将包含参数本身。

您可以像这样调度参数:

for (int i = 1; i < argc; i++)
{  
    if (i + 1 != argc)
    {
        if (strcmp(argv[i], "-filename") == 0) // This is your parameter name
        {                 
            char* filename = argv[i + 1];    // The next value in the array is your value
            i++;    // Move to the next flag
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 在第 3 行,您正在比较指针,而不是字符串......它应该是:`if ( strcmp( argc[i], "-filename") == 0) {` (3认同)