处理命令行标志在C / C ++(Handling command line flags in C/

2019-07-19 11:33发布

我要寻找一个非常简单的解释/教程上什么标志。 据我所知,标志工作指示命令做什么。 例如:

rm -Rf test

我知道,rm命令将删除test文件夹,而且-Rf标志将强制命令删除不只是文件夹,但在它的文件。

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

Answer 1:

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

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

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 x.c

你应该看到的输出:

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


Answer 2:

在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 )。 短选项可以一起glommed到一个参数( -rf ),只要他们没有接受参数(见下文)。
  • 选项本身可能采取的论点。
    • 一个选项的参数-x要么是在剩余argv项,或者如果该条目没有进一步的文字,在第二天argv条目是否它以短划线开头。
    • 选项的参数被设定了与一个等号: --output=outputfile.txt
  • 如果可能的话,不同的方案的相对排序(与他们的论据)应该没有观察到效果。
  • 特别选项--意思是“命令行选项这一点后,不把任何东西,哪怕它看起来像一个”。 之所以如此,例如,你可以删除一个文件名为“ -f通过键入” rm -- -f
  • 特别选项-意思是“读标准输入”。
  • 有一些按照惯例保留短选项字母:最重要的是
    • -v =是冗长
    • -q =安静
    • -h =打印帮助文本
    • -o 文件 =输出到文件
    • -f =力(不提示危险行为的确认,只是做他们)

还有一堆帮助您解析命令行参数的库。 最便携,但也最有限的,这些是getopt的 ,这是时下内置到C库在大多数系统上。 我建议你阅读所有的文档GNU argp ,即使你不想使用特定的一个,因为它会进一步教育你的约定。

另外值得一提的是通配符扩展( rm -rf *是不断调用程序之前 )完成。 如果运行上面的示例程序如./a.out *在目录仅包含二进制和它的源代码,你会得到

argv[0] = ./a.out
argv[1] = a.out
argv[2] = test.c


Answer 3:

其实你可以写自己的C ++ PROGRAMM它接受这样的命令行参数:

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

变量ARGC包含的参数的数目,而字符*将包含参数本身。

你可以派遣这样的参数:

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


Answer 4:

在自己的C程序,你可以处理在您认为合适的任何方式的命令行选项。 在C命令行参数来在主的参数(INT的argc,字符* argv的[])方法为字符串。

如果你想在类似于大多数UNIX命令的方式来处理命令行参数,你可能寻找的功能是getopt的()

祝好运!



Answer 5:

最简单的办法就是先写你main()如下所示:

INT主(INT的argc,字符* argv的[]){...

然后是主内决定什么发生在命令行参数或“标志”。 您argv中找到他们,他们的数量是ARGC。



Answer 6:

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

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

您的电弧的传递参数的#,指针插上U的实际参数列表。 因此对于

rm -Rf test

ARGC是3,和argv数组将包含你的论点。 通知的argc> = 1,因为该程序名称本身计数(RM)。 -RF是你的第二个参数和测试是你的第三个。

所以每当你在UNIX输入命令,你基本上是正在执行的程序,并通过他们,他们的操作参数。

如果你真的在UNIX操作系统很感兴趣,你应该看看了叉以及它们如何工作。 这可以得到相当混乱新人的,所以只有当你在OS真正感兴趣和程序是如何执行的。



Answer 7:

GNU libc的,这是你的系统很可能使用,为这些所谓的getopt可以用来解析以一种合理的方式选择一个库。 有让你下面链接的文档中开始的例子。

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



文章来源: Handling command line flags in C/C++