天天看點

C/C++中如何讓程式接受并處理指令行參數

作者:海洋餅幹叔叔

經由作業系統,使用者可以為應用程式的運作指定額外參數,進而影響應用程式的行為。對于C/C++程式而言,經由作業系統提供的運作參數可由main()函數擷取并處理。

知識産權協定

允許以教育/教育訓練為目的向學生或閱聽人進行免費引用,展示或者講述,無須取得作者同意。

不允許以電子/紙質出版為目的進行摘抄或改編。

讀者如果有使用Linux終端或者Windows指令行的的經驗,便知道作業系統是可以向應用程式傳遞參數的。比如,下述Linux終端指令為目前目錄下的檔案file1制作一份拷貝,其檔案名為file2。

cp file1 file2           

這行指令裡的字元串”file1”、”file2”即為cp指令的參數。讀者自行建立并建構(build)▲完成的可執行程式也是應用程式,我們也可以通過作業系統為自己的應用程式提供參數,進而影響該應用程式的行為。對于C/C++程式而言,經由作業系統提供的運作參數可由main()函數擷取并處理。

請讀者在Qt Creator中建立一個名為add的Plain C Application,然後将其中的main.c修改如下:

//Project - add
#include <stdio.h>
#include <stdlib.h>

int main(int argc, char **argv){   //char *argv[]
    for (int i=0;i<argc;i++)
        printf("%d: %s,  %p\n", i, argv[i], argv[i]);

    int iSum = 0;
    for (int i=1;i<argc;i++)
        iSum += atoi(argv[i]);

    printf("sum = %d",iSum);
    return 0;
}           

在編譯并運作程式前,我們還需要在Qt Creator中做一些設定,以便指定程式運作的參數。在Qt Creator中選擇“項目”頁,在“運作設定”中将Command line arguments設定為33 777 103,這相當于給應用程式提了以空格分隔的三個參數,分别為33、777和103,如圖6-7所示。請注意圖中箭頭以及黑色方框辨別的内容。

C/C++中如何讓程式接受并處理指令行參數

接下來運作程式,結果如下:

0: C:\C2Cpp\C6_Pointer_Reference\build-add-Desktop_Qt_5_14_1_MinGW_64_bit-Debug\add.exe,  00000000001E14A0
1: 33,  00000000001E1420
2: 777,  00000000001E1440
3: 103,  00000000001E1500
sum = 913           

說明:在讀者的計算機上,執行結果中的位址很可能與本書不同。

要解釋這段程式及其執行結果,需要從main()函數的參數說起。

int main(int argc, char **argv){   //char *argv[]
...           

argc及argv都是通過作業系統傳遞給應用程式的:

  • argc為int類型,表示作業系統傳遞給應用程式的參數個數。argc應該源自英文arguments count,意即參數總數。
  • argv為char**,它是一個指向指針的指針。事實上,argv指向的記憶體塊中存儲了argc個位址,每個位址均指向一個以0結尾的字元數組,這些字元數組即為參數字元串。實踐中,可以把指針argv視為一個一維數組的數組名,該數組中有argc個元素,每個元素是一個類型為char*的指針。是以,有的教科書中會将main()函數中的argv描述成char* argv[ ],意即元素類型為char*的一維數組。argv這個名字源自英文arguments vector,意即參數向量。

第3行:stdlib.h頭檔案引入函數atoi( const char* str),該函數将參數字元串轉換成對應的整數。如果希望将字元串轉換成浮點數,應使用函數atof()。提醒讀者注意,提供給atoi()函數的參數字元串需要是合法的整數格式,否則可能會引發錯誤。

第6 ~ 7行:通過循環,将argc個argv[i]分别按字元串以及位址形式輸出。本例中,執行結果的前4行為相關輸出。可以看出,argc的值為4,其中,第0個參數字元串即為被運作的可執行檔案的路徑,後面3個就是我們在“運作設定”中填入的Command line arguments。

第9 ~ 11行:通過循環将除去第0個之外的全部參數字元串轉換為整數,并求和。從字元串到整數的轉換是通過atoi()函數完成的。

第13行:列印求得的和。

直覺上,本例中的應用程式add.exe将參數中列出的全部整數相加,并輸出和值。為了進一步讓讀者體會參數字元串的使用, 作者在自己的Windows 10計算機上,進行了如下操作:

  • 進入Windows指令行;
  • 通過cd指令進入到了可執行檔案add.exe所在的目錄,路徑可在本例執行結果的第1行找到;
  • 執行指令add.exe 11 22 33 44,應用程式add.exe脫離Qt Creator運作,輸出了和110。

相關過程如下圖所示。

C/C++中如何讓程式接受并處理指令行參數

本案例節選自作者編寫的教材及配套實驗指導書。

《C++程式設計基礎及應用》(高等教育出版社,出版過程中)

《Python程式設計基礎及應用》,高等教育出版社

《Python程式設計基礎及應用實驗教程》,高等教育出版社

C/C++中如何讓程式接受并處理指令行參數

高校教師同行如果期望索取樣書,教學支援資料,加群,請私信作者,聯系時請提供學校及個人姓名為盼,各高校在讀學生勿擾為謝。

青少年讀者們如果期望系統性地學習Python及C/C++程式設計語言,歡迎嘗試下述今日頭條(西瓜)免費視訊課程。

C/C++從入門到放棄(重慶大學現場版)

Python程式設計基礎及應用(重慶大學現場版)

C/C++中如何讓程式接受并處理指令行參數