为什么没有传递给argv []的参数?

时间:2017-03-12 14:34:25

标签: c command-line-arguments argv argc

所以,我注意到我的argc始终是1,因为我始终会收到消息Error: missing command line arguments!,但正如代码中所述,我正在使用argv[1]和{{ 1}}读取文件名。

在这种情况下,不应该argv[2]argc,并且能够传递该错误吗?

注意:

  1. 如果我没有使用3语句,在输入输出文件的名称后,我的程序会崩溃。
  2. 对于输入文件,我已经在项目文件夹中创建了这个文件,所以我只输入该文件的名称。
  3. 这是代码:

    if (argc < 2)

1 个答案:

答案 0 :(得分:9)

您完全误解了argcargv的目的。它们应该在程序启动之前接收提供的命令行参数(程序参数),而不应该在运行时保存 scannned 输入。

引用C11,章节§5.1.2.2.1,

  

如果声明它们,main函数的参数应遵循以下条件   约束:

     

- argc的值应为非负值。

     

- argv[argc]应为空指针。

     

- 如果argc的值大于零,则数组成员argv[0]通过   argv[argc-1]包含应包含指向字符串的指针   程序启动前主机环境实现定义的值。该   意图是在程序启动之前为程序提供信息   来自托管环境中的其他地方。

  

如果argc的值大于零,则argv[0]指向的字符串   代表程序名称; argv[0][0]如果是,则为空字符   程序名称不能从主机环境中获得。如果argc的值是   大于一,argv[1]通过argv[argc-1]指向的字符串   代表程序参数。

详细说明,当调用程序时,如

./a.out three total arguments

然后,在你的程序中

  • argc将为4
  • argv[0]将为./a.out
  • argv[1]将为three
  • argv[2]将为total
  • argv[3]将为arguments
  • argv[4]将为NULL(请参阅上面argv[argc]的属性)

要概括,argv[1] - argv[argc-1]将保留提供的参数,argv[argc]将为NULL

您无需显式扫描输入,这些值将从主机环境中填充。

另一方面,您不能只调用

这样的程序
./a.out

exptect argc3(或任何其他值,1除外),argv[1] - argv[n-1]有效,因为在编译时,调用程序无法知道你计划在运行时提供一些值。这不是透视。