本方法使用 windows 进行讲解。
我不懂什么专业术语,就个人感觉来说。
开门见山 当我们看到 以下程序的时候 我们会发现 argc 和 *argv[] (第一眼观察就可以知道的是 argc是整型,argv是一个可以接收二维数组的二级指针)
#define _CRT_SECURE_NO_WARNINGS
#include<bits/stdc++.h>
using namespace std;
int main(int argc,char* argv[]) { // 看这行 不要看其他的先。
cout << argc << endl;
puts(argv[0]);
puts(argv[1]);
system("pause");
return 0;
}
我们为了知道 这两个变量是干啥的,当然需要实践--运行程序 试探一下才知 是驴是马。话不多说 运行!!
不好意思 它报错了!!!但是这正是切入 正题最重要 和不可缺少的一次试探。
为什么呢?继续试探!
我们把视线ka看到 监视1 窗口 也就是 报错框下面的 debug 变量窗口。我们首先看见的就是 NULL 对于写程序多的人来说 NULL引发错误并不少见。点开argv[1] 左侧的jian箭头 我们看见的是 <无法读取内存> 6个大字,所以我们 puts(argv[1]) 失败是必然的情况。
都说了知错要改 但是这次不一样 我们要想方设法 使它合法 ,所以我忽略错误 使用 g++ 编译器 编译。我们看编译以后的文件是长这(niao)样:
要是问我 我看见什么 我肯定会说 为什么搞了个快捷方式!!对!感觉很对!这次就是用 快捷方式 来讲解。(命令行 等会,这不排队嘛! 急什么)
我不兜圈子,我就直接说:要使得 puts(argv[1]); 合法 可以这么做
1.快捷方式 右键 点 属性 然后看见下面这个框
2.我们在 目标那里 (喂 看到 目标 哪里了吗?? 第一个编辑框就是了咯~)
我们拉到最后 (怎么拉 你看图就知道到了)
3.我们空一格 然后试探地输入 A 然后点击应用(不会又看不到 应用按钮吧!在你后面) ,先不要关闭这个属性窗口。
改完是这个样子的。
4.我们不关闭 这个属性窗口(为什么?因为我们还要用啊!你要关闭也行,一会再开)
我们双击 那个快捷方式 试试看。
是 A 是 A 。。。。 同时发现 刚才第一行的 1 变成了 2 .
这下傻子都会明白了 刚刚 1 的时候 输出puts(argv[0]) 把 C:\Users\!ZERO\source\repos\Project10\Project10\源.exe
正常输出 程序路径
(如果细心一点 你会发现 为什么 第一次和第二次的的 程序路径好像不一样)
。。。。因为 你没认真看我文章 我说过我拿的是g++来编译的 原来那个是 VS bi'a编译的文件压根就不在一起。
注意到程序输出 2 以后,我们再次修改属性内容 如下
记得改完点 应用。
我猜 一会它 变成 3 你信不信! 好的 它成 3 了 一点都不神奇。
这下我们知道了 argc == 1 的时候只能输出 可以一个字符串 argc == 2 可以输出两个字符串 现在我没告诉你们 argc == 3 输出几个字符串。我也不会告诉你们了。你们就迷茫吧!! 但是我说 argc==10的时候 可以输出 10个字符串。(*argv[])
好的 我想说的是 等命令行的同学 可以走了 我是不会告诉你用命令行让argc变成2 的。
那只道这些 有什么卵用呢 ?
没有。你可以关闭这个页面了 顺便说一下我喜欢骚粉 !最后再告诉你 快捷方式的后缀名称是 .lnk 大写是 .LNK 当然还可以不大不小写 .LnK .lNK Lnk .lNk ```` (你能分辨大写的I(ai)和小写的l(L小写)) << 吗?;
利用以上方法 制作小工具 解决实际问题
1.假使 我们 不是输入字符串 而是 一个程序的路径作为 *argv[] 的字符串传进 main 函数之后 能不能通过函数来打开这个程序。
假定这个程序是 QQ应用程序。
方法是 使用system(字符串);来执行。
来试一下: 我 们修改一下 程序
接着g++编译 .
接着 我们改一下那个快捷方式 的参数
同时告诉你们 用双引号引起字符串也行 这样可以支持空格字符串。
因为宿舍要熄灯了 我不能多扯淡了 马上运行给看看结果:
试想一下 如果我们 三个参数 并且 使用 system(); 也是可以运行的。
在想一下 如果 我的 system();这样写会怎么样 system(argv[0]); // 程序会自己yu运行自己??一切的一切还需你自己探索才行
好了 我讲完了。
我在山东来自海南
2018年8月31日 22点27分