所以,我注意到我的argc
始终是1
,因为我始终会收到消息Error: missing command line arguments!
,但正如代码中所述,我正在使用argv[1]
和{{ 1}}读取文件名。
在这种情况下,不应该argv[2]
自argc
,并且能够传递该错误吗?
注意:
3
语句,在输入输出文件的名称后,我的程序会崩溃。这是代码:
if (argc < 2)
答案 0 :(得分:9)
您完全误解了argc
和argv
的目的。它们应该在程序启动之前接收提供的命令行参数(程序参数),而不应该在运行时保存 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 argc
为3
(或任何其他值,1除外),argv[1]
- argv[n-1]
要有效,因为在编译时,调用程序无法知道你计划在运行时提供一些值。这不是透视。