9.4 帶參數(shù)的主函數(shù)
C語言規(guī)定,主函數(shù)也可以帶參數(shù),就像我們編寫的用戶函數(shù)一樣,可以帶參數(shù),也可以不帶參數(shù)。主函數(shù)的形式參數(shù)只有兩個:一個形式參數(shù)是記錄了參數(shù)的個數(shù),這是一個整型的形式參數(shù),其名稱規(guī)定為“argc”;第二個形式參數(shù)依次記錄了在調(diào)用該主函數(shù)(即執(zhí)行程序)時給出的實際參數(shù)內(nèi)容(字符串),這個形式參數(shù)是一個字符指針型數(shù)組,每個元素指向一個實際參數(shù)對應的字符串,第二個形式參數(shù)名稱規(guī)定為“argv[]”。
帶參數(shù)的主函數(shù)在定義時,其函數(shù)頭的定義規(guī)定如下:
main(argc,argv)
int argc; /*第1個形式參數(shù):整型*/
char *argv[]; /*第2個形式參數(shù):字符指針型數(shù)組*/
如果主函數(shù)不帶參數(shù),執(zhí)行目標程序時只要按下列格式輸入程序名就可以了:
程序名↙ (其中的↙表示回車,下同)
我們通常把在操作系統(tǒng)下按上述格式執(zhí)行目標程序時,輸入的一行稱為“命令行”。
若主函數(shù)帶參數(shù),則執(zhí)行目標程序時,應按下列格式給出相應的實際參數(shù):
程序名 實際參數(shù)1 實際參數(shù)2 … 實際參數(shù)n↙
上述格式也是一個命令行。
此時,系統(tǒng)會自動在內(nèi)存開辟區(qū)域依次存放程序名和所有的實際參數(shù),同時給主函數(shù)的形式參數(shù)賦值,結(jié)果如下:
形參argc 賦值為n+1,表示連同程序名在內(nèi)共有n+1個參數(shù)。
形參argv[0]賦值為存放“程序名”字符串的首地址;
argv[1]賦值為存放“實際參數(shù)1”字符串的首地址;
.
.
.
argv[n]賦值為存放“實際參數(shù)n”字符串的首地址。
例如,有一個名為“my_copy.c”的程序,其主函數(shù)帶有參數(shù)。如果在執(zhí)行時,輸入的命令行如下:my_copy a:\ccw1.txt b:\ccw2.txt↙
則形式參數(shù)的值如下:
argc=3
argv[0]指向字符串 "my_copy"
argv[1]指向字符串 "a:\ccw1.txt"
argv[2]指向字符串 "a:\ccw2.txt"
在程序中可以通過形式參數(shù)獲得相應的實際參數(shù),參與程序的運算和加工。
【例9-8】編一個帶參數(shù)的主函數(shù)。運行時,在程序名后帶有2個整數(shù),程序的功能是輸出這2個整數(shù)的和。
程序清單如下:
#include "stdlib.h" /*程序中用到數(shù)據(jù)轉(zhuǎn)換類函數(shù)*/
main(argc,argv)
int argc;
char *argv[];
{ int x,y,sum;
x=atoi(argv[1]); /*將第1個實際參數(shù)對應的字符串轉(zhuǎn)換成整數(shù)存入x*/
y=atoi(argv[2]); /*將第2個實際參數(shù)對應的字符串轉(zhuǎn)換成整數(shù)存入y*/
sum=x+y;
printf("%d+%d=%d\n",x,y,sum);
}
假定本程序編譯后的目標程序名為"test1.exe",執(zhí)行該程序時輸入的命令行如下:
test1 5 10↙
則程序運行后的輸出結(jié)果為:5+10=15。
【例9-9】編一個程序,完成磁盤文件復制。源文件名和目標文件名隨程序運行時輸入。例如,復制a盤根目錄下的文件ccw1.txt為a盤根目錄下的ccw2.txt,則執(zhí)行程序時輸入的命令行如下:程序名 a:\ccw1.txt a:\ccw2.txt↙。
程序清單如下:
#include "stdio.h" /*程序中用到文件處理類函數(shù)*/
main(int argc,char *argv[])
{ FILE *fp1,*fp2;
if ((fp1=fopen(argv[1],"rb"))==NULL)
{ printf(“"file can not open!\n");
exit(0);
} /*以只讀方式打開argv[1]指向的源文件名對應的二進制文件*/
if ((fp2=fopen(argv[2],"wb"))==NULL)
{ printf("file can not open!\n");
exit(0);
} /*以只寫方式打開argv[2]指向的目標文件名對應的二進制文件*/
while(!feof(fp1)) /*復制源文件到目標文件*/
fputc(fgetc(fp1),fp2);
fclose(fp1); /*關(guān)閉fp1所指向的源文件*/
fclose(fp2); /*關(guān)閉fp2所指向的目標文件*/
}