2009年12月16日 星期三

C語言 - argc 與 argv

今天被問說怎會沒用過!!! 我覺得好羞愧,趕快來做筆記跟記錄一下
以後就會了..... = =

C語言提供一個可以在命令列中將參數引入的功能。也就是說,我們可以在MS-DOS模式下,在執行檔名稱的後面,可以填入需要的參數。

常見的為主程式 main() 有兩個引數 argc 與 argv [1],即函數 main 標題的定義為
main( int argc, char *argv[] )
其作用是 執行該檔 及 所相隨的 option。

如果將一程式 file.c 編譯完之後, 產生一 執行檔 file.exe。 當執行 file.exe 如
c:> file option1 option2 option3
則執行 file.exe 時, argc 的值為 4, argv 則 含 4 個字串,即
argv[0]="file"、 argv[1]="option1"、 argv[2]="option2"、 argv[3]="option3"。
如此一來 程式的設計, 可以有 較多的彈性。


【說明】[4]:
1、argc 與 argv為C語言的關鍵字,是專門用在命令列的參數名。
2、argc是argument count(參數總和)的縮寫,代表包括指令本身的參數個數。系統會自動計算所輸入的參數個數。
3、argv則是argument value的縮寫。代表參數值。也就是使用者在命令列中輸入的字串,每個字串以空白相隔。同時,系統會自動將程式本身的名稱指定給argv[0],再將程式名稱後面所接續的參數依序指定給argv[1]、argv[2]….。


試試看這個例子[3]:
#include ;

int main(int argc, char *argv[])
{
    printf("%d\n",argc);
    while(argc)
    printf("%s\n",argv[--argc]);

   return 0;
}

假設將其編譯為test.exe,
在命令行下,
test hello
得到的輸出結果為:
2
hello
test

/*
main(int argc, char *argv[]),其中argc是指變量的個數,
本例中指test和hello,即為2,argc至少為1
argv是一個char *的數組,其中存放變量的內容,此處 argv[0]中存放test,argv[1]存放hello
*/



再來個例子,題目為把檔案file1 copy到檔案file2去
檔名為copyFile.c [1][2]
#include
   void main(int argc, char *argv[])
   {
       char c;
       int toScreen = 1;
       FILE *fpin, *fpout;

       if(argc < 2 || argc > 3)
       {
          printf("The correct format is: copyFile file1 file2\n");
          exit(1);
       }

       fpin = fopen(argv[1], "r");
       if( !fpin )
       {
           printf("The file: %s is not found!\n", argv[1]);
           return;
       }
       if(argc == 3)
       {
          fpout = fopen(argv[2], "w");
          if( !fpout )
          {
              printf("The file: %s is not found, or no available space!\n", argv[2]);
              return;
          }
          toScreen = 0;
       }

       while( (c=getc(fpin)) != EOF)
       {
           if( toScreen )
              putchar(c);
           else
              putc(c, fpout);
       }

       fclose(fpin);
       if( !toScreen)
          fclose(fpout);
   }



References:
[1]http://nknucc.nknu.edu.tw/~jwu/c/cpgch10.htm#third
[2]http://tw.myblog.yahoo.com/zentai-chang/article?mid=791&prev=797&next=-1
[3]http://www.lslnet.com/linux/f/docs1/i04/big5124525.htm
[4]http://www.eyny.com/thread-1158039-1-1.html

沒有留言:

張貼留言