跳转到内容

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 );
   }
华夏公益教科书