声明:
这篇文章是写给初学者看的,已经知道我要说什么的读者可以跳过,也可以花一分钟扫一遍温习一下。因为最近知识星球中有好几个问题都是跟这个相关的,所以我就专门说一说,以后再有类似问题就直接关门放本文了。
关于argc与argv其实很容易说清楚,但是我主要是想借这个例子来说一下如何探究编程中遇到的不会的东西的问题。换言之,这篇文章是“鱼与渔兼备”的。
闲言少叙,开始正文。
经常遇到argc和argv但是不知道它们是啥?
我用C++和Python比较多,只说我了解的。在C++中见到argc与argv应该是最多的 ,这二位老兄经常端坐在main()函数的参数列表里。Python中用的较多的应该是sys.argv。
虽然经常见到,然而很多人还是不知道argc和argv为何物。也许可以说这个锅是巨硬的,或者说是它的宇宙第一IDE——Visual Studio的。(VS:这个锅我不背!)
包括我在内的很多人,从一开始就一直是用VS编程,写好程序只需要按个按钮或者快捷键,VS就自动地把一切都做好了,至于这中间发生了什么,我们根本不需要关心也不需要知道。正是因为VS的强大,所以我们在编写C++程序的时候几乎根本用不到命令行。
然而我们经常见到的用argc和argv的程序正是需要用命令行运行的,而且是在命令行运行程序传参数的时候用的。
argc,读作arg C。是argument counter的缩写。即参数计数器。
argv,读作arg V。是argument vector的缩写,这里vector是数组的意思,即参数组成的数组。
我们以最简单的C++程序为例:
Windows下面不打开VS如何运行这个程序?
既然我们是要探究命令行参数的,显然就不能用VS这个神器了,我们直接在命令行中用VS的编译期cl.exe对程序进行编译。
在windows的命令行中用cl.exe需要设置几个环境变量,过程略显麻烦。由于这种需求对于大部分人来说几乎没有,而且与本文主题不太相关,故而略去。只需要看下面的内容就足矣理解argc和argv了。是在有需求的请自行百度谷歌之。这也是我写本文的目的之一,教会一些人如何自己动手解决问题。
下面我直接截图了。我把上面的程序保存在名为 的文件中,然后再其所在文件夹下 在当前文件夹下打开命令行窗口。此时文件夹下只有这一个文件。
然后我们在命令行中输入 或者 :
可以看到生成了两个文件 和 。
编译器产生通用对象文件格式 (COFF)对象 (.obj) 文件。链接器产生可执行文件 (.exe) 或动态链接库文件 (dll)。默认情况下cl.exe编译完后自动调用link.exe进行连接。所以通常会生成两个文件: 和 。
这个时候我们就可以运行程序了。直接在命令行输入: 或者 即可。
探究argc和argv
上面只是为了说明如何在命令中运行程序,为介绍命令行参数做铺垫。接下来才是正餐。既然是需要传参的,那么我就试着在运行的时候传入参数试试:
在命令行输入 试试会出现什么结果:
正确输出了 。貌似没啥影响,而且我们还是不知道argc和argv是啥?
我们可以试着输出argc,这是我们调试程序的时候最常用的方法。
稍微修改下程序,改成如下形式:
然后在命令行输入命令 重新编译程序,生成新的 。
然后我们依次尝试运行 、 、 ,看看分别会输出什么?
貌似发现了某种了不得的规律!
argc竟然等于我们输入的参数的个数!Amazing!
然后我们再来修改下程序,把argv也输出来看看。
仍然是在命令行输入命令 重新编译程序,生成新的 。
然后运行 :
回过头来再看前面的两句话:
argc,读作arg C。是argument counter的缩写。即参数计数器。
argv,读作arg V。是argument vector的缩写,这里vector是数组的意思,即参数组成的数组。
argv的运用
以后我们在程序中看到如下的打开图片的程序,也许就知道是什么意思了:
为什么下标是从1开始的而不是0,往上看一眼就可以发现,argv[0]就是程序本身,从argv[1]开始才是传递给程序的参数。
如果我们不用命令行运行,而是想要直接在VS中运行呢?那就直接用需要传递给程序中的参数在程序中写好就行了,比如上面的argv[1]就可以替换为某张图片的具体路径。
之前一直说的是C++的,所以最后用一个Python的例子结束本文吧。也是最近的一次在知识星球中被问到的问题,在之前的文章《40行代码的人脸识别实践》中,需要如下命令运行程序,我就直接引用了:
我们在 所在的文件夹下打开命令行,运行如下命令
由于 和 名字实在太长,所以我把它们重命名为 和 。
而程序的开头是这样的:
对照之前说的,可以看看程序中的判断和各种路径的获取。
下面的才是是本文重点
渔呢?
你可能感兴趣的文章
领取专属 10元无门槛券
私享最新 技术干货