在C命令行程序中处理`argv`

时间:2010-08-10 01:44:48

标签: c command-line-arguments

我已经读过argv的第一个数组成员将始终是程序名。

坚持下去是否有用?我正在学习,请原谅我,如果这是一个愚蠢的问题。

人们是否曾将第一个成员卸下,因为它没用(并将argv重置为少一个?),或者将其留在那里是最佳实践,因为人们期望它永远存在(并且它可以工作)开箱即用argc)?

6 个答案:

答案 0 :(得分:7)

  

我已经读过argv的第一个数组成员将始终是程序名。

应该。 C和C ++都要求如果argc大于零,argv[0]应该是程序名或空字符串。

某些系统在所有情况下都不一定遵循此约定(例如,在Windows上,您可以使用CreateProcess创建新进程,而不是在用于填充的命令行参数中传递程序名称argcargv)。

  

坚持下去是否有用?

不确定。例如,如果您想生成自己的另一个实例,或者想要打印您的程序名称(例如在使用说明中)。

  

人们有没有取消第一个成员的速度,因为它没用,或者留下最佳实践?

不要改变实际的论点;下一个出现的人可能会期望他们处于原始状态。

答案 1 :(得分:4)

准确地说,argv[0]是传递给exec(2)的任何东西,它通常是程序名称,但可以是任何东西。

不要取消它,因为有太多隐藏的依赖项依赖它。

答案 2 :(得分:3)

预计argv [0]将始终包含可执行文件的名称。因此,你永远不应该删除它。

至于它是否有用,argv [0]的一个用途是,如果你希望你的应用程序根据它的调用方式改变行为。

例如,

Busybox在嵌入式Linux系统上使用它。通常,您将拥有可执行文件的单个副本,并创建具有不同名称的可执行文件的符号链接。例如。 cp,rm,ls等 Busybox然后根据argv [0]的内容确定要执行的功能。

答案 3 :(得分:3)

第一个参数并不总是程序名称 - 它取决于它的调用方式(参见here)。

通常,argv[0]用于帮助文字:

fprintf(stderr, "Usage: %s <foo> [bar]\n", argv[0]);

移动阵列并不是非常有用或有效。您也可以从索引1开始使用argv。

答案 4 :(得分:0)

argv [0]的内容不是由ANSI定义的。 argv可枚举:

main(int argc,char**argv)
{
  while( argc-- )
    puts(*argv++);
  return 0;
}

答案 5 :(得分:0)

来自ISO C99,§5.1.2.2.1,

  

如果argc的值大于零,则argv [0]指向的字符串表示程序名称;如果程序名不能从主机环境获得,则argv [0] [0]应为空字符。

因此,在符合要求的实现中,您可以依赖argv[0]作为程序的名称​​,如果您之前测试它的存在(也就是说,如果您可以断言{{1} })。