我一直在阅读Levine的Flex &野牛一书,我看到了下面的代码:
main(argc, argv)
int argc;
char **argv;
{
if(argc > 1) {
if(!(yyin = fopen(argv[1], "r"))) {
perror(argv[1]);
return (1);
}
}
yylex();
我觉得这部分不太难理解,比如第一行:
char **argv;
据我所知,它应该与这一部分有关:
if(!(yyin = fopen(argv[1], "r")))
所以我可以解释它正在阅读一个输入操作,这是因为“r”,而argv[1]
指的是控制台的一行输入。是这样吗?我不知道作者为什么要使用一个双指针指向argv。我想当没有有效的输入时,它会打印一个描述性错误perror()
,但在哪种情况下会发生这种情况?
1条答案
按热度按时间6ie5vjzr1#
char **argv
被C++编译器解释为与char* argv[]
相同,即指向指针数组的指针。正如你可能已经知道的,argv
代表传递给程序可执行文件的参数,例如./program arg1 arg2
。你可以把argv
看作字符串数组(C字符串),如果这能简化事情的话,数组的每个元素都是一个参数。你的解释基本上是正确的,它检查至少有一个参数
argc > 0
(参数计数),然后使用第一个参数(argv[1]
asargv[0]
实际上指的是程序名./program
)作为文件名。然后,它尝试打开一个名为argv[1]
的文件进行阅读。如果失败,fopen
返回NULL
。如果文件不存在,则可能发生这种情况。