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 );
}