【轉載】關於main函數

來自:http://blog.csdn.net/jylnn/archive/2008/03/08/2158429.aspx

 C的設計原則是把函數作爲程序的構成模塊。main()函數稱之爲主函數,一個C程序總是從main()函數開始執行的。

一、main()函數的形式

     在最新的 C99 標準中,只有以下兩種定義方式是正確的:

        int main( void )--無參數形式

         {

         ...

         return 0;

         }

        

         int main( int argc, char *argv[] )--帶參數形式

         {

         ...

         return 0;

         }

     int指明瞭main()函數的返回類型,函數名後面的圓括號一般包含傳遞給函數的信息。void表示沒有給函數傳遞參數。關於帶參數的形式,我們等會討論。

    

     瀏覽老版本的C代碼,將會發現程序常常以

    

    main()

     這種形式開始。C90標準允許這種形式,但是C99標準不允許。因此即使你當前的編譯器允許,也不要這麼寫。

    

     你還可能看到過另一種形式:

    void main()

    

     有些編譯器允許這種形式,但是還沒有任何標準考慮接受它。C++ 之父 Bjarne Stroustrup 在他的主頁上的 FAQ 中明確地表示:void main( ) 的定義從來就不存在於 C++ 或者 C 。所以,編譯器不必接受這種形式,並且很多編譯器也不允許這麼寫。

    

     堅持使用標準的意義在於:當你把程序從一個編譯器移到另一個編譯器時,照樣能正常運行。

二、main()函數的返回值

     從前面我們知道main()函數的返回值類型是int型的,而程序最後的 return 0; 正與之遙相呼應,0就是main()函數的返回值。那麼這個0返回到那裏呢?返回給操作系統,表示程序正常退出。因爲return語句通常寫在程序的最後,不管返回什麼值,只要到達這一步,說明程序已經運行完畢。而return的作用不僅在於返回一個值,還在於結束函數。

     現在我們來做一個小試驗(注意:本人的系統是Windows XP, 編譯環境是TC)來觀察main()函數的返回值。編寫如下代碼並編譯運行:

   //a.c    

     #include "stdio.h"

     int main(void)

     {

         printf("I love you.");

    

         return 0;

     }

     將這個文件保存爲a.c,編譯運行後會生成一個a.exe文件。現在打開命令提示符,在命令行裏運行剛纔編譯好的可執行文件,然後輸入   echo %ERRORLEVEL% ,回車,就可以看到程序返回 一個0 。如果把 return 0; 改爲 return 99; ,那麼很顯然,再次執行上述步驟以後你可以看到程序返回99。要是你這樣寫 return 99.99; 那還是返回99,因爲99.99被傳給操作系統之前,被強制類型轉換成整數類型了。

     現在,我們把a.c改回原來的代碼,然後再編寫另一個程序b.c:

    //b.c

     #include "stdio.h"

     int main(void)

     {

         printf("\nI'm too.");

    

         return 0;

     }

     編譯運行後打開命令提示符,在命令行裏輸入a&&b 回車,這樣你就可以看到《人鬼情未了》裏面經典的愛情對白:

    

    I love you.

    I'm too.

     && 的含義是:如果 && 前面的程序正常退出,則繼續執行 && 後面的程序,否則不執行。所以,要是把a.c裏面的 return 0; 刪除或者改爲 return 99; ,那麼你只能看到 I love you. 。也就是說,程序b.c就不執行了。現在,大家該明白 return 0; 的作用了吧。

三、main()函數的參數

     C編譯器允許main()函數沒有參數,或者有兩個參數(有些實現允許更多的參數,但這只是對標準的擴展)。這兩個參數,一個是int類型,一個是字符串類型。第一個參數是命令行中的字符串數。按照慣例(但不是必須的),這個int參數被稱爲argc(argument count)。大家或許現在才明白這個形參爲什麼要取這麼個奇怪的名字吧,呵呵!至於英文的意思,自己查字典吧。第二個參數是一個指向字符串的指針數組。命令行中的每個字符串被存儲到內存中,並且分配一個指針指向它。按照慣例,這個指針數組被稱爲argv(argument value)。系統使用空格把各個字符串格開。一般情況下,把程序本身的名字賦值給argv[0],接着,把最後的第一個字符串賦給argv[1],等等。

     現在我們來看一個例子:

    //c.c  

     #include "stdio.h"

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

     {

         int count;

    

         printf("The command line has %d arguments: \n",argc-1);

         for(count=1;count<argc;count++)

             printf("%d: %s\n",count,argv[count]);

      

         return 0;

     }

     編譯運行,在命令行輸入c I love you 回車,下面是從命令行運行該程序的結果:

    The command line has 3 arguments:

    1:I

    2:love

    3:you

     從本例可以看出,程序從命令行中接受到4個字符串(包括程序名),並將它們存放在字符串數組中,其對應關係:

    argv[0]   ------>     c(程序名)

    argv[1]   ------>     I

    argv[2]   ------>     love

    argv[3]   ------>     you

     至於argc的值,也即是參數的個數,程序在運行時會自動統計,不必我們操心。

     這個例子中,每個字符串都時一個單詞(字母),那既然是字符串,要把一句話當作參數賦給程序該怎麼辦?你可以在命令行裏這樣輸入 c   "I love you."   "I'm too."。程序運行結果:

    The command line has 2 arguments:

    1:I love you.

    2:I'm too.

     其對應關係:

    argv[0]   ------>     c(程序名)

    argv[1]   ------>     I love you.

    argv[2]   ------>     I'm too.

     要注意的是,你在命令行的輸入都將作爲字符串形式存儲於內存中。也就是說,如果你輸入一個數字,那麼要輸出這個數字,你應該用%s格式而非%d或者其他。

     再來看一個例子:

    //d.c

     #include "stdio.h"

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

     {

         FILE *fp;

    

         fp=fopen(argv[1],"w");

         fputs("I love you.",fp);

         fclose(fp);

    

         return 0;

     }

     編譯運行,打開命令行並輸入d love.txt 回車。這樣,打開d.c文件所在的目錄,你會發現多了一個名爲 love.txt 的文件,打開后里面的內容正是世界上說的最多的那句話。

    當然,你可能會說我不需要使用命令行參數就可以做到這些。是的,你當然可以。使用命令行參數的理由或許就是練習命令行用法,以備以後需要編寫基於命令行的程序。還有一個好處是,不需要C環境就可以運行已經編譯好的程序。 




c語言中命令行參數argc,argv
關鍵詞: argc,argv                                           
main(int argc,char **argv)
argv爲指針的指針
argc爲整數
char **argv or: char *argv[] or: char argv[][]
main()括號內是固定的寫法。

下面給出一個例子來理解這兩個參數的用法:

假設程序的名稱爲prog,

當只輸入prog,則由操作系統傳來的參數爲:

argc=1,表示只有一程序名稱。
argc只有一個元素,argv[0]指向輸入的程序路徑及名稱:./prog

當輸入prog para_1,有一個參數,則由操作系統傳來的參數爲:

argc=2,表示除了程序名外還有一個參數。
argv[0]指向輸入的程序路徑及名稱。
argv[1]指向參數para_1字符串。

當輸入prog para_1 para_2 有2個參數,則由操作系統傳來的參數爲:

argc=3,表示除了程序名外還有2個參數。
argv[0]指向輸入的程序路徑及名稱。
argv[1]指向參數para_1字符串。
argv[2]指向參數para_2字符串。

void    main(    int    argc,    char    *argv[]    )   
   char    *argv[]    :    argv是一個指針數組,他的元素個數是argc,存放的是指向每一個參數的指針,他的第一個元素即argv[0]爲編譯生成的可執行文件名(包括路徑eg:"F:\VC\Ex1\Debug\Ex1.exe"),從二個元素(argv[1])開始,是每一個參數   
   int    argc    表示argv的大小,是實際參數個數+1,其中+1是因爲argv[0]是編譯後的可執行文件名

 

 

main()主函數

     每一C 程序都必須有一main()函數, 可以根據自己的愛好把它放在程序的某 
個地方。有些程序員把它放在最前面, 而另一些程序員把它放在最後面, 無論放 
在哪個地方, 以下幾點說明都是適合的。 
     1. main() 參數 
     在Turbo C2.0啓動過程中, 傳遞main()函數三個參數: argc, argv和env。 
      * argc:   整數, 爲傳給main()的命令行參數個數。 
      * argv:   字符串數組。 
               在DOS 3.X 版本中, argv[0] 爲程序運行的全路徑名; 對DOS 3.0 
               以下的版本, argv[0]爲空串("") 。 
               argv[1] 爲在DOS命令行中執行程序名後的第一個字符串; 
               argv[2] 爲執行程序名後的第二個字符串; 
               ... 
               argv[argc]爲NULL。 
      *env:   安符串數組。env[] 的每一個元素都包含ENVVAR=value形式的字符 
串。其中ENVVAR爲環境變量如PATH或87。value 爲ENVVAR的對應值如C:\DOS, C: 
\TURBOC(對於PATH) 或YES(對於87)。 
     Turbo C2.0啓動時總是把這三個參數傳遞給main()函數, 可以在用戶程序中 
說明(或不說明)它們, 如果說明了部分(或全部)參數, 它們就成爲main()子程序 
的局部變量。 
     請注意: 一旦想說明這些參數, 則必須按argc, argv, env 的順序, 如以下 
的例子: 
      main() 
      main(int argc) 
      main(int argc, char *argv[]) 
      main(int argc, char *argv[], char *env[]) 
     其中第二種情況是合法的, 但不常見, 因爲在程序中很少有隻用argc, 而不 
用argv[]的情況。 
     以下提供一樣例程序EXAMPLE.EXE,   演示如何在main()函數中使用三個參數: 
      /*program name EXAMPLE.EXE*/ 
      #i nclude <stdio.h> 
      #i nclude <stdlib.h> 
      main(int argc, char *argv[], char *env[]) 
      { 
           int i; 
           printf("These are the %d   command- line   arguments passed   to 
                   main:\n\n", argc); 
           for(i=0; i<=argc; i++) 
             printf("argv[%d]:%s\n", i, argv[i]); 
           printf("\nThe environment string(s)on this system are:\n\n"); 
           for(i=0; env[i]!=NULL; i++) 
                printf(" env[%d]:%s\n", i, env[i]); 
      } 
     如果在DOS 提示符下, 按以下方式運行EXAMPLE.EXE: 
     C:\example first_argument "argument with blanks"   3   4   "last   but 
one" stop! 
     注意: 可以用雙引號括起內含空格的參數, 如本例中的:    "   argument 
with blanks"和"Last but one")。 
     結果是這樣的: 
      The value of argc is 7 
      These are the 7 command-linearguments passed to main: 
      argv[0]:C:\TURBO\EXAMPLE.EXE 
      argv[1]:first_argument 
      argv[2]:argument with blanks 
      argv[3]:3 
      argv[4]:4 
      argv[5]:last but one 
      argv[6]:stop! 
      argv[7]:(NULL) 
      The environment string(s) on this system are: 
      env[0]: COMSPEC=C:\COMMAND.COM 
      env[1]: PROMPT=$P$G             /*視具體設置而定*/ 
      env[2]: PATH=C:\DOS;C:\TC       /*視具體設置而定*/ 
  
      應該提醒的是: 傳送main() 函數的命令行參數的最大長度爲128 個字符 (包 
括參數間的空格),   這是由DOS 限制的。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章