跳轉到內容

C 語言入門/C 命令列引數

來自華夏公益教科書,自由的教學讀物

C 語言允許程式使用 "main()" 的兩個可選引數 "argc (引數計數)" 和 "argv (引數向量)" 來獲取在呼叫可執行檔案時提供的命令列引數。

"argc" 變數給出提供給程式的命令列引數的計數。此計數包括程式本身的名稱,因此它始終至少為一個。 "argv" 變數是指向字串陣列的第一個元素的指標,每個元素包含一個命令列引數。

以下示例程式演示了

   /* cmdline.c */

   #include <stdio.h>

   void main( int argc, char *argv[] )
   {
     int ctr;
     for( ctr=0; ctr < argc; ctr++ )
     {
       puts( argv[ctr] );
     }
   }

如果從此處執行程式命令列如下

   stooges moe larry curley

—輸出為

   stooges
   moe
   larry
   curley

在實際操作中,命令列可能會接受許多引數,其中一些引數將指示選項或開關,由前導 "-" 或 "/" 指定。一些開關可以單獨指定或一起指定,並且一些開關可以接受相關引數。其他引數將是文字字串,給出數字、檔名或其他資料。

以下示例程式演示瞭解析任意程式的命令列引數。它假設合法選項字元為 "A"、"B"、"C" 和 "S",無論大小寫。 "S" 選項必須後跟代表引數的一些字串。

   /* cparse.c */
   
   #include <stdio.h>
   #include <stdlib.h>
   #include <string.h>
   
   main( int argc, char *argv[] )
   {
     int m, n,                              /* Loop counters. */
         l,                                 /* String length. */
         x,                                 /* Exit code. */
         ch;                                /* Character buffer. */
     char s[256];                           /* String buffer. */
   
     for( n = 1; n < argc; n++ )            /* Scan through args. */
     {
       switch( (int)argv[n][0] )            /* Check for option character. */
       {
       case '-':
       case '/': x = 0;                   /* Bail out if 1. */
                 l = strlen( argv[n] );
                 for( m = 1; m < l; ++m ) /* Scan through options. */
                 {
                   ch = (int)argv[n][m];
                   switch( ch )
                   {
                   case 'a':              /* Legal options. */
                   case 'A':
                   case 'b':
                   case 'B':
                   case 'c':
                   case 'C':
                   case 'd':
                   case 'D': printf( "Option code = %c\n", ch );
                             break;
                   case 's':              /* String parameter. */
                   case 'S': if( m + 1 >= l )
                             {
                               puts( "Illegal syntax -- no string!" );
                               exit( 1 );
                             }
                             else
                             {
                               strcpy( s, &argv[n][m+1] );
                               printf( "String = %s\n", s );
                             }
                             x = 1;
                             break;
                   default:  printf( "Illegal option code = %c\n", ch );
                             x = 1;      /* Not legal option. */
                             exit( 1 );
                             break;
                   }
                   if( x == 1 )
                   {
                     break;
                   }
                 }
                 break;
       default:  printf( "Text = %s\n", argv[n] ); /* Not option -- text. */
                 break;
       }
     }
     puts( "DONE!" );
   }

為了更實際的示例,這裡有一個簡單的程式,基於上一章中的示例,它試圖從命令列讀取輸入檔案和輸出檔案的名稱。如果不存在檔案,則使用標準輸入和標準輸出。如果存在一個檔案,則假定它是輸入檔案,並開啟標準輸出。這是用於簡單的檔案處理程式的有用模板。

   /* cpfile.c */

   #include <stdio.h>
   #include <stdlib.h>
   #define MAX 256

   void main( unsigned int argc, unsigned char *argv[] )
   {
   
     FILE *src, *dst;
     char b[MAX];
   
     /* Try to open source and destination files. */
   
     switch (argc)
     {
     case 1:          /* No parameters, use stdin-stdout. */
       src = stdin;
       dst = stdout;
       break;

     case 2:          /* One parameter -- use input file & stdout. */
       if ( ( src = fopen( argv[1], "r" )) == NULL )
       {
          puts( "Can't open input file.\n" );
          exit( 0 );
       }
       dst = stdout;
       break;

     case 3:         /* Two parameters -- use input and output files. */
       if ( ( src = fopen( argv[1], "r" )) == NULL )
       {
          puts( "Can't open input file.\n" );
          exit( 0 );
       }
       if ( ( dst = fopen( argv[2], "w" )) == NULL )
       {
          puts( "Can't open output file.\n" );
          exit( 0 );
       }
       break;

     default:        /* Too many parameters. */
       puts( "Wrong parameters.\n" );
       exit( 0 );

     }
   
     /* Copy one file to the next. */
   
     while( ( fgets( b, MAX, src ) ) != NULL )
     {
        fputs( b, dst );
     }
   
     /* All done, close up shop. */
   
     fclose( src );
     fclose( dst );
   }
華夏公益教科書