C语言提供了与命令行参数的连接。一般情况下为了访问命令行参数,我们可以使用这样的代码:
#include<stdio.h>
int main(int argc,char *argv[])
{
............
}
C语言中main()函数可以接受两个参数。argc参数表示参数的数量,它的值就是命令行的参数数量。argv参数表示参数向量,它是一个数组,数组元素是char类型的指针。这种类型的数组可以看成是字符串数组。数组中的各个元素按顺序指向用于执行程序的命令行的各个单词。因此,argv[0]是个指令命令名(即程序名) 本身的指针。下面通过例子说明命令行参数的用法,假设我们编写了程序,并把可执行代码放在cnt_letters文件中。命令行的内容如下所示:
cnt_letters chapter1 data1
它以文件名chapter1和data1作为命令行参数调用cnt_letters 程序。这个程序应该从chapter1文件中进行读取,并写入到data1文件中。如果我们使用了不同的命令,如下所示:
cnt_letters chapter2 data2
这个程序就是从chapter2文件进行读取,并把结果写入到data2文件中。在程序中,命令行中的3个单词分别是通过argv[0]、argv[1]和argv[2]这三个指针进行访问的。
下面是程序的源代码:
#include<stdio.h>
#include<stdlib.h>
int main(int argc,char *argv[])
{
int c,i,letter[26];
FILE *ifp,*ofp;
if(argc!=3){
printf("/n%s%s%s/n/n%s/n%s/n/n",
"Usage: ",argv[0]," infile outfile",
"The uppercase letters in infile will be counted.",
"The results will be written in outfile.");
exit(1);
}
ifp=fopen(argv[1],"r");
ofp=fopen(argv[2],"w");
for(i=0;i<26;++i){
letter[i]=0;
}
while((c=getc(ifp))!=EOF){
if(c>='A'&&c<='Z')
++letter[c-'A'];
for(i=0;i<26;++i){
if(i%6==0)
putc('/n',ofp);
fprintf(ofp,"%c:%5d ",'A'+i,letter[i]);
}
putc('/n',ofp);
return 0;
}
如果我们使用下面的命令行:
cnt_letters chapter1 data1
这样程序将统计chapter1文件中大写字母的各数,并写入data1文件中。打开data1文件可可看到以下内容:
A: 0 B: 0 C: 0 D: 0 E: 0 F: 0
G: 0 H: 0 I: 0 J: 0 K: 0 L: 0
M: 0 N: 0 O: 0 P: 0 Q: 0 R: 0
S: 0 T: 0 U: 0 V: 0 W: 0 X: 0
Y: 0 Z: 0
程序说明:
我们输入命令cnt_letters chapter1 data1后,argv[0]指向字符串“cnt_letters”,argv[1]指向字符串"chapter",argv[2]指向字符串"data1",C系统自动完成这个任务。
getc()函数是个在stdio.h中定义的宏。它与getchar()类似,区别在于它接受一个FILE类型的指针为参数。当getc(ifp)被调用时,它从ifp所指向的文件读取下一个字符。标识符EOF表示文件尾(end-of-file)。它是一个在stdio.h中定义的符号常量,一般定义如下:
#define EOF (-1)
如果文件中不再有更多的字符,getc()就返回EOF这个值。putc()也是在stdio.h中定义的,与putchar()类似,区别是它的第二个参数是个FILE指针。第一个参数的值则按照字符格式写入到指定的文件中。
fprintf(ofp,"%c:%5d ",'A'+i,letter[i]);
fprintf()与printf()类似,只是它的第一个参数是个FILE指针。当这个函数被调用时,它将写入到指定的文件中,而不是打印到屏幕上。