C/C++語言中的main函數,經常帶有參數argc,argv,如下:
int main(int argc, char** argv)
int main(int argc, char* argv[])
這兩個參數的作用是什麼呢?argc 是指命令行輸入參數的個數,argv存儲了所有的命令行參數。假如你的程序是hello.exe,如果在命令行運行該程序,運行命令爲:
hello.exe Shiqi Yu
那麼,argc的值是 3,argv[0]是"hello.exe",argv[1]是"Shiqi",argv[2]是"Yu"。
下面的程序演示argc和argv的使用:
#include int main(int argc, char ** argv)
{ int i; for (i=0; i < argc; i++) printf("Argument %d is %s./n", i, argv[i]); return 0; }
假如上述代碼編譯爲hello.exe,那麼運行 hello.exe a b c d e 將得到 Argument 0 is hello.exe.Argument 1 is a.Argument 2 is b.Argument 3 is c.Argument 4 is d.Argument 5 is e.
運行 hello.exe lena.jpg 將得到 Argument 0 is hello.exe.Argument 1 is lena.jpg.
在前面課程的學習中,對main()函數始終作爲主調函數處理,也就是說,允許main()調用 其它函數並傳遞參數。事實上,main()函數既可以是無參函數,也可以是有參的函數。對於有 參的形式來說,就需要向其傳遞參數。但是其它任何函數均不能調用main()函數。
當然也同樣 無法向main()函數傳遞,只能由程序之外傳遞而來。這個具體的問題怎樣解決呢? 我們先看一下main()函數的帶參的形式:
main(argc,argv) int argc,char *argv[]; { ..... } 從函數參數的形式上看,包含一個整型和一個指針數組。當一個C的源程序經過編譯、鏈接後,會生成擴展名爲.EXE的可執行文件,這是可以在操作系統下直接運行的文件,換句話說,就是由系統來啓動運行的。
對main()函數既然不能由其它函數調用和傳遞參數,就只能由系統在啓動運行時傳遞參數了。 在操作系統環境下,一條完整的運行命令應包括兩部分:命令與相應的參數。其格式爲: 命令參數1參數2....參數n 此格式也稱爲命令行。命令行中的命令就是可執行文件的文件名,其後所跟參數需用空格分隔,併爲對命令的進一步補充,也即是傳遞給main()函數的參數。
命令行與main()函數的參數存在如下的關係: 設命令行爲:program str1 str2 str3 str4 str5 其中program爲文件名,也就是一個由program.c經編譯、鏈接後生成的可執行文件program.exe,其後各跟5個參數。
對main()函數來說,它的參數argc記錄了命令行中命令與參數的個數,共6個,指針數組的大小由參數argc的值決定,即爲char*argv[6],指針數組的取值情況如圖6-15所示。 數組的各指針分別指向一個字符串。應當引起注意的是接收到的指針數組的各指針是從命令行的開始接收的,首先接收到的是命令,其後纔是參數。
下面用實例來說明帶參數的main()函數的正確使用。 [例6-29] 利用圖形庫函數繪製一個變化的環。
它是把一個半徑爲R 1的圓周分成n份,然 後以每個等分點爲圓心,以R s爲半徑畫n個圓(關於作圖的詳細理論本教材第9章第1節作了專 門介紹,這裏只作簡單分析)。利用m a i n ( )函數的帶參數形式,我們可以從鍵盤以命令行的方 式輸入R 1和R s及屏幕的背景色。
#include /*包含圖形庫函數的頭文件* / #include #define pi 4.1415926
m a i n ( a r g c , a r g v ) int argc;char *argv[]; /* 定義帶參數的m a i n ( ) * /
{ int x,y,r1,rs,color; double a; int gdriver=DETECT,gmode;
initgraph(&gdriver,&gmode,"..//bgi ")啓;/動*圖形工作方式*/ r1=atoi(argv[1]);/*計算基礎圓半徑*/
rs=atoi(argv[2]);/*計算同心圓半徑*/
color=atoi(argv[3]);/*背景色*/
cleardevice();/*清除圖形屏幕*/
setbkcolor(color);/*設置背景色*/
setcolor(4);/*設置圖形顯示顏色*/
for(a=0;a<=2*pi;a+=pi/18)/*繪製同心圓*/
{ x=r1*cos(a)+320; y=r1*sin(a)+240; circle(x,y,rs);/*以圓心座標爲x、y,半徑爲rs畫圓*/
}
getch();/*等待按鍵繼續*/
close graph();/*關閉圖形工作方式*/
} 若程序名爲L6-29.c,經編譯、連結生成可執行文件L6-29.exe。
在操作系統的環境下運行程序,命令行方式爲: l6-29 40 20 3 則命令行與main()函數的參數有如圖6-16所示的關係。 圖6-16中,argv[0]是程序名,argv[1]是r1的值, argv[2]是rs的值,argv[3]是屏幕的背景色。 由於指針數組均存放字符串,所需的圓半徑及背景 色彩通過atoi()函數轉換爲整型。 通過帶參數的main()函數,我們可以爲自己的程序設置口令,在運行程序的命令行中給出所需的口令,正確則繼續,否則退出。程序圖形輸出如圖6-17所示。
[例6-30]將上述程序作修改,在程序的入口處添置密碼,若給定密碼正確,則顯示圖 形。
#include
#include
#define pi 4.1415926
m a i n ( a r g c , a r g v )
int argc;char *argv[];
{ int x,y,r1,rs,color; double a;
int gdriver=DETECT,gmode;
if (strcmp(argv[1],"pass")!=0) 設/置* 口令的比較*/
{ printf("password error!/n"); e x i t ( 0 ) ;
}
initgraph(&gdriver,&gmode,"..//bgi ");
r1=atoi(argv[2]);
rs=atoi(argv[3]);
color=atoi(argv[4]);
cleardevice();
setbkcolor(color);
setcolor(4);
for(a=0;a<=2*pi;a+=pi/18)
{ x=r1*cos(a)+320; y=r1*sin(a)+240; circle(x,y,rs); }
getch();
closegraph();
}
在操作系統的環境下運行程序, 命令行中增加口令“p a s s”,命令行方式爲: l6-30 pass 20 40 3 指針數組的存儲字符串如圖6-18所示。 若給定字符串argv[1]的值是pass,則程序正確運行,否則程序退出。口令正確的情況下,顯示的圖形爲圖6-17中的一個。