1. 程式人生 > >argc 和 *argv[] 的有趣講解和小方法

argc 和 *argv[] 的有趣講解和小方法

本方法使用 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分