C++控制臺程序接收朋蔫、解析參數(shù)及被如何調(diào)用罚渐、調(diào)試

說明:本次不使用Qt內(nèi)容,完全使用c++標(biāo)準(zhǔn)來寫

一驯妄、控制臺程序接收荷并、解析參數(shù)

無論控制臺程序也好、還是界面應(yīng)用程序也好青扔,C++的入口函數(shù)就是main函數(shù)源织,所有的執(zhí)行第一個入口函數(shù)。
在main函數(shù)的入?yún)⒅袝в袃蓚€入?yún)?/p>

int main(int nArgc, char *argv[])

第一個參數(shù):數(shù)組的大小微猖,也就是攜帶參數(shù)的個數(shù)
第二個參數(shù):程序執(zhí)行接收到的參數(shù)
當(dāng)執(zhí)行程序沒有攜帶任何參數(shù)的時候谈息,參數(shù)列表默認(rèn)有一個參數(shù),就是本程序*.exe的所在路徑凛剥。

參數(shù).png

如果你準(zhǔn)備讓這個程序能接收命令參數(shù)的方式執(zhí)行業(yè)務(wù)邏輯侠仇,那么只需要加上對參數(shù)的解析就好了。

接下來實(shí)現(xiàn)一個{ConsoleCMD.exe -r(read) D://CMDText.txt -w(write) D://CMDText2.txt} 這樣命令的例子

1犁珠、首先緩存參數(shù)

vector<string> argvList;
for (int i = 0; i < nArgc; ++i)
{
    argvList.push_back(argv[i]);
}

當(dāng)然你也可以使用別的方式逻炊,比如說直接按照參數(shù)順序賦值給結(jié)構(gòu)體或者類成員。不用再次循環(huán)去獲取了犁享;

2余素、解析參數(shù)

最簡單的解析,你也可以根據(jù)你自身的業(yè)務(wù)情況來封裝解析
比如讀取的文件格式的解析與校驗(yàn)炊昆,支持 “-help” “-version”
以及 -r -w 解析空白字符等等

bool checkPath(const string& strFile)
{
    LPWIN32_FIND_DATAA FindFileData = new _WIN32_FIND_DATAA();
    HANDLE hFind = 0;

    LPCSTR text = strFile.c_str();

    hFind = FindFirstFileA(text, FindFileData);

    if (hFind == INVALID_HANDLE_VALUE)
    {
        delete FindFileData;
        return false;
    }

    delete FindFileData;
    return true;
}

bool parseParam(const vector<string>& argvList)
{
    //這里假定只接受5個參數(shù)
    int nSize = argvList.size();
    if ((1 < nSize && nSize != 5) || nSize > 5)
    {
        cout << "參數(shù)個數(shù)輸入錯誤!" << endl;
        return false;
    }

    //解析第二個參數(shù)
    if ("-r" != argvList[1] && "-R" != argvList[1])
    {
        return false;
    }

    if (!checkPath(argvList[2]))
    {
        cout << "找不到" << argvList[2] << "該路徑下的文件!" << endl;
        return false;
    }

    if ("-w" != argvList[3] && "-W" != argvList[3])
    {
        return false;
    }

    //最后一個參數(shù)為寫入文件桨吊,可以不做解析威根,當(dāng)文件不存在的時候進(jìn)行默認(rèn)的創(chuàng)建
    return true;
}

3、控制臺命令main代碼

int main(int nArgc, char* argv[])
{
    if (1 < nArgc)//當(dāng)執(zhí)行程序輸入了參數(shù)
    {
        vector<string> argvList;

        for (int i = 0; i < nArgc; ++i)
        {
            argvList.push_back(argv[i]);
        }

        if (!parseParam(argvList))
        {
            cout << "參數(shù)輸入錯誤!" << endl;
            return -1;
        }

        //執(zhí)行任務(wù)
    }

    //沒參數(shù)輸入的處理.....
    return 0;
}

4视乐、頭文件

#include <iostream>
#include <vector>
#include <windows.h>
#include <string>

二医窿、控制臺程序的調(diào)用、調(diào)試

1炊林、控制臺調(diào)用

ConsoleCMD.exe的目錄下,“shift+右鍵”卷要,選擇“在此處打開命令窗口”
輸入命令:ConsoleCMD.exe -r D://CMDText.txt -w D://CMDText2.txt

命令執(zhí)行.png

2渣聚、代碼調(diào)用

#include <string.h>
using namespace std;

int main()
{
    string strCMD = "E://work//c++_Project//ConsoleCMD//Debug//ConsoleCMD.exe";
    string strParam = " -r D://CMDText.txt -w D://CMDText2.txt";//注意參數(shù)間的空格

    strCMD += strParam;

    system(strCMD.c_str());
}

3、調(diào)試控制臺程序

在寫一些較為復(fù)雜的參數(shù)的時候僧叉,難免會需要進(jìn)行調(diào)試奕枝,那么怎么快速進(jìn)入調(diào)試呢?
可以單步調(diào)試瓶堕、可以打日志調(diào)試
我的方式是中斷隘道、附加進(jìn)行調(diào)試

MessageBox(nullptr, L"test", L"test", 0);

在main函數(shù)開始的時候,直接彈出一個對話框郎笆,中斷當(dāng)前進(jìn)程
然后在vs的調(diào)試菜單內(nèi)找到“附加到進(jìn)程”谭梗,打開后選擇控制臺進(jìn)程進(jìn)行調(diào)試。

附加進(jìn)程.png

斷點(diǎn)已中斷
中斷.png

三宛蚓、其他獲取命令的方法

int nArgc = 0;
LPWSTR* argv = nullptr;
LPWSTR pCmdLineW = GetCommandLineW();
argv = CommandLineToArgvW(pCmdLineW, &nArgc);
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末激捏,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子凄吏,更是在濱河造成了極大的恐慌远舅,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,743評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件痕钢,死亡現(xiàn)場離奇詭異图柏,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)任连,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,296評論 3 385
  • 文/潘曉璐 我一進(jìn)店門蚤吹,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人课梳,你說我怎么就攤上這事距辆。” “怎么了暮刃?”我有些...
    開封第一講書人閱讀 157,285評論 0 348
  • 文/不壞的土叔 我叫張陵跨算,是天一觀的道長。 經(jīng)常有香客問我椭懊,道長诸蚕,這世上最難降的妖魔是什么步势? 我笑而不...
    開封第一講書人閱讀 56,485評論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮背犯,結(jié)果婚禮上坏瘩,老公的妹妹穿的比我還像新娘。我一直安慰自己漠魏,他們只是感情好倔矾,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,581評論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著柱锹,像睡著了一般哪自。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上禁熏,一...
    開封第一講書人閱讀 49,821評論 1 290
  • 那天壤巷,我揣著相機(jī)與錄音,去河邊找鬼瞧毙。 笑死胧华,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的宙彪。 我是一名探鬼主播矩动,決...
    沈念sama閱讀 38,960評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼释漆!你這毒婦竟也來了铅忿?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,719評論 0 266
  • 序言:老撾萬榮一對情侶失蹤灵汪,失蹤者是張志新(化名)和其女友劉穎檀训,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體享言,經(jīng)...
    沈念sama閱讀 44,186評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡峻凫,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,516評論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了览露。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片荧琼。...
    茶點(diǎn)故事閱讀 38,650評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖差牛,靈堂內(nèi)的尸體忽然破棺而出命锄,到底是詐尸還是另有隱情,我是刑警寧澤偏化,帶...
    沈念sama閱讀 34,329評論 4 330
  • 正文 年R本政府宣布脐恩,位于F島的核電站,受9級特大地震影響侦讨,放射性物質(zhì)發(fā)生泄漏驶冒。R本人自食惡果不足惜苟翻,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,936評論 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望骗污。 院中可真熱鬧崇猫,春花似錦、人聲如沸需忿。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,757評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽屋厘。三九已至汞扎,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間擅这,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,991評論 1 266
  • 我被黑心中介騙來泰國打工景鼠, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留仲翎,地道東北人。 一個月前我還...
    沈念sama閱讀 46,370評論 2 360
  • 正文 我出身青樓铛漓,卻偏偏與公主長得像溯香,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子浓恶,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,527評論 2 349

推薦閱讀更多精彩內(nèi)容

  • 運(yùn)行操作 CMD命令:開始->運(yùn)行->鍵入cmd或command(在命令行里可以看到系統(tǒng)版本玫坛、文件系統(tǒng)版本) CM...
    小明yz閱讀 2,752評論 0 8
  • 命令簡介 cmd是command的縮寫.即命令行 。 雖然隨著計(jì)算機(jī)產(chǎn)業(yè)的發(fā)展包晰,Windows 操作系統(tǒng)的應(yīng)用越來...
    Littleston閱讀 3,315評論 0 12
  • 運(yùn)行操作 CMD命令:開始->運(yùn)行->鍵入cmd或command(在命令行里可以看到系統(tǒng)版本湿镀、文件系統(tǒng)版本) CM...
    小沐子_IT閱讀 2,077評論 0 4
  • 寫在前面的話 代碼中的# > 表示的是輸出結(jié)果 輸入 使用input()函數(shù) 用法 注意input函數(shù)輸出的均是字...
    FlyingLittlePG閱讀 2,743評論 0 8
  • win7 cmd管理員權(quán)限設(shè)置 net localgroup administrators 用戶名 /add 把“...
    f675b1a02698閱讀 5,159評論 0 11