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

我正在寻找一个非常简单的解释/教程是什么标志。 我明白,标志工作表明一个命令该怎么做。 例如:

rm -Rf test 

我知道rm命令会删除testing文件夹,而-Rf标志将强制该命令不仅擦除文件夹而且擦除其中的文件。

但是,标志在哪里读取/编译? 什么处理标志? 例如,我可以编写我自己的C / C ++程序并指定不同的标志,以便程序做不同的事情吗? 我希望我提出正确的问题。 如果没有,请让我知道。

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

解析,解释和使用这些参数取决于程序员(你),虽然有库可以帮助。

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

如果你把这个程序编译成a.out ,并运行它:

 prompt$> ./a.out ParamOne ParamTwo -rf xc 

你应该看到输出:

 Argument 0 : a.out Argument 1 : ParamOne Argument 2 : ParamTwo Argument 3 : -rf Argument 4 : xc 

在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; } 

并用与你的例子'rm'命令相同的参数调用它,你会得到这个:

 $ ./a.out -Rf test argv[0] = ./a.out argv[1] = -Rf argv[2] = test 

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

操作系统根本不关心什么是论据; 这取决于你的程序来解释它们。 但是,它们是如何运作的,其中最重要的是以下几点:

  • 参数分为选项非选项 。 选项以短划线开头,非选项不要。
  • 选项,顾名思义,应该是可选的 。 如果你的程序需要一些命令行参数来做任何有用的事情,这些参数应该是非选项(即它们不应该以破折号开始)。
  • 选项可以进一步分为短期选项,这是一个单一的破折号后跟一个单一的字母( -r-f )和选项,这是两个破折号,后面跟着一个或多个破折号分隔的单词( --recursive--frobnicate-the-gourds )。 只要没有一个参数需要参数(参见下文),简短的选项就可以组合成一个参数( -rf )。
  • 期权本身可能有争议。
    • short选项-x的参数是argv条目的其余部分,或者如果该条目中没有更多的文本,那么接下来的argv条目是否以短划线开头。
    • long选项的参数是用等号表示的:– --output=outputfile.txt
  • 如果可能的话,不同的选项(与他们的论点)的相对顺序应该没有可观察到的效果。
  • 特殊选项--意思是“即使看起来像是一个选项,也不要在命令行的这一点之后处理任何东西”。 例如,您可以通过键入rm -- -f来删除名为“ -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 

其实你可以编写你自己的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 } } } 

在你自己的C程序中,你可以用你认为合适的方式处理命令行选项。 C中的命令行参数以字符串的形式出现在main(int argc,char * argv [])方法的参数中。

如果您想以类似于大多数UNIX命令的方式处理命令行参数,那么您可能要查找的函数是getopt()

祝你好运!

最简单的事情是写你的main()像这样:

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

然后在这个主内部决定命令行参数或“标志”发生了什么。 你可以在argv中找到他们,他们的编号是argc。

标志是传递到程序主入口点的参数。 例如,在一个C ++程序中你可以拥有

 int main(int arc, char* argv[]){ return 0; } 

你的弧是传入的参数的数量,指针给你实际参数的列表。 因此对于

 rm -Rf test 

argc是3,argv数组将包含你的参数。 注意argc> = 1,因为程序名本身就是计数(rm)。 -RF是你的第二个参数,测试是你的第三个参数。

因此,无论何时在UNIX中输入命令,实质上都是执行程序并传递它们所运行的参数。

如果你真的对unix操作系统感兴趣,你应该查找叉和它们是如何工作的。 但是,如果你对操作系统感兴趣,以及如何执行程序,这对新手来说可能会相当困惑。

GNU libc很可能在你的系统上可用,它有一个名为getopt的库,可以用来以合理的方式解析选项。 有一些例子可以帮助你开始下面链接的文档。

http://www.gnu.org/software/libc/manual/html_node/Getopt.html#Getopt