C 語言入門/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 );
}