首页
社区
课程
招聘
[原创]编程要学的有参main函数之命令行参数杂谈
2022-3-28 13:38 13994

[原创]编程要学的有参main函数之命令行参数杂谈

2022-3-28 13:38
13994

编程要学的有参main函数之命令行参数杂谈

1、软件main函数内部处理

2、终端命令行窗口传参

3、注册表相关传参


本帖于2022.03.28由duan首发,如有转载,请注明出处。


新手小白入门贴,大神请忽视跳过,如有不当之处,敬请谅解。


内部处理和其他函数相同,大家估计都很熟悉了,关于如何向程序传参可能有些迷惑。

我们向一个编译完成的程序传参,有三个形式,其实形式2有时可以说是形式1的简化操作。

形式1、通过命令行的终端传参。

形式2、把文件直接拖到程序图标时传参。

形式3、通过关联相应文件打开时传参。

一、软件main函数内部处理,先看一个标准的书写形式。

#include <iostream>
using namespace std;

int main(int argc,char *argv[])    //argv是指向字符数组的指针,argc是数组的大小。
{
    cout << "Hello World!" << endl;
    return 0;
}

argc(argument count)实参的数量,argv(argument vector/values)实参向量或者称为实参数值组。

此处的main函数的参数其实和其他普通函数的参数是没有区别的,只是其他函数的传递什么参数是程序员设计的,而此处是根据系统约定传参的。

默认argv[0]是程序名,程序名应该知道吧?不知道就去看看你运行的可执行的“××.exe”文件,其中的“××”就是程序名。

默认的程序名是固定的,约定俗成,知道就好,反正在软件处理这个阶段是不用它的。

数组里有多少参数看argc的大小,要处理的参数从argv[1]开始的,main函数的第二个函数是指向数组的指针,涉及的知识点是函数的参数不能是函数或者数组,所以这里使用了指针类型。

至于怎么处理,大家自由发挥吧,例如可验证argv[1]是否等于“fileName”,相等就打开一个文件,其他功能类似。

二、终端命令行窗口传参

我们先通过用记事本(notepad)打开一个readme.txt文件演示传参,注意事项:路径和文件名最好用英文,且都不含空格(有空格一般用“”号括住)。

win+r然后输入cmd打开命令行窗口,当然你也可以在开始菜单搜索cmd然后打开命令行窗口。

假定我们在目录C:\Users\dzh2020里有个readme.txt

其他传参也类似,第一个是软件的名称,必须是可执行文件(扩展名是exe或者类似文件)。后边的参数用单空格分开。因为记事本的第二个参数处理程序执行的是要打开的文件,所以我们输入文件名后,这个文件名就会传递给记事本软件内main函数的第二个参数,然后调用处理程序打开文件。

我们执行上面的命令行后,argc是2,argv[0]是notepad,argv[1]是readme.text。


我们在把一个文件拖动到能打开它的软件上时,传参的过程同上一样。

三、注册表相关传参

一个文件在双击后可以打开,是因为它关联了相应的软件,而这个关联信息保存在系统注册表HKEY_CLASSES_ROOT根键下的。

还以文本文档的readme.txt为例看它是如何关联的。

win+r然后输入regedit打开注册表。当然你也可以在C:\Windows找到对应软件。

通过以上找到信息,我们知道,当我们把一个文件关联到相应软件时,会生一个类似.txt和txtfile的项。扩展名可任意,扩展关联项名也任意,方便记忆即可。

当我们双击关联后的文档时,文档根据扩展名找到关联项的对应软件地址打开软件,并把文档的地址替换%1传参给软件。

这样我们得到的信息依然同命令行参数。argc是2,argv[0]是软件名,argv[1]是系统帮我们替换%1后的文档地址。


关于main函数的参数处理,很多时候传参对中文支持不好,还是建议英文传参。

我们在传参的时候如果有空格,需要用“”括起来,空格是个很特殊的值,很多软件在识别到空格默认已经读取完成,不会继续执行。

如果地址里有"\",在软件读取时候也要做特殊处理,因为"\"在软件里有特殊含义(转义字符),一般它和不同的字符组合完成特定功能,例如\n换行。所以我们在字符串里表示单斜杆"\"是这样的"\\"。




[CTF入门培训]顶尖高校博士及硕士团队亲授《30小时教你玩转CTF》,视频+靶场+题目!助力进入CTF世界

收藏
点赞2
打赏
分享
最新回复 (0)
游客
登录 | 注册 方可回帖
返回