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分