致青春2小说在线阅读:带参数的主函数2

来源:百度文库 编辑:九乡新闻网 时间:2024/04/30 02:40:42
9.4 带参数的主函数

  C语言规定,主函数也可以带参数,就像我们编写的用户函数一样,可以带参数,也可以不带参数。主函数的形式参数只有两个:一个形式参数是记录了参数的个数,这是一个整型的形式参数,其名称规定为“argc”;第二个形式参数依次记录了在调用该主函数(即执行程序)时给出的实际参数内容(字符串),这个形式参数是一个字符指针型数组,每个元素指向一个实际参数对应的字符串,第二个形式参数名称规定为“argv[]”。

  带参数的主函数在定义时,其函数头的定义规定如下:
    main(argc,argv)
    int argc; /*第1个形式参数:整型*/
    char *argv[]; /*第2个形式参数:字符指针型数组*/
  如果主函数不带参数,执行目标程序时只要按下列格式输入程序名就可以了:
    程序名↙ (其中的↙表示回车,下同)
  我们通常把在操作系统下按上述格式执行目标程序时,输入的一行称为“命令行”。
  若主函数带参数,则执行目标程序时,应按下列格式给出相应的实际参数:
    程序名 实际参数1 实际参数2 … 实际参数n↙
  上述格式也是一个命令行。
  此时,系统会自动在内存开辟区域依次存放程序名和所有的实际参数,同时给主函数的形式参数赋值,结果如下:
    形参argc 赋值为n+1,表示连同程序名在内共有n+1个参数。
    形参argv[0]赋值为存放“程序名”字符串的首地址;
    argv[1]赋值为存放“实际参数1”字符串的首地址;
        .
        .
        .
    argv[n]赋值为存放“实际参数n”字符串的首地址。

  例如,有一个名为“my_copy.c”的程序,其主函数带有参数。如果在执行时,输入的命令行如下:my_copy a:\ccw1.txt b:\ccw2.txt↙
  则形式参数的值如下:
    argc=3
    argv[0]指向字符串 "my_copy"
    argv[1]指向字符串 "a:\ccw1.txt"
    argv[2]指向字符串 "a:\ccw2.txt"
  在程序中可以通过形式参数获得相应的实际参数,参与程序的运算和加工。

  【例9-8】编一个带参数的主函数。运行时,在程序名后带有2个整数,程序的功能是输出这2个整数的和。

  程序清单如下:

    #include "stdlib.h" /*程序中用到数据转换类函数*/
    main(argc,argv)
    int argc;
    char *argv[];
    { int x,y,sum;
    x=atoi(argv[1]); /*将第1个实际参数对应的字符串转换成整数存入x*/
    y=atoi(argv[2]); /*将第2个实际参数对应的字符串转换成整数存入y*/
    sum=x+y;
    printf("%d+%d=%d\n",x,y,sum);
    }

  假定本程序编译后的目标程序名为"test1.exe",执行该程序时输入的命令行如下:

      test1 5 10↙

  则程序运行后的输出结果为:5+10=15。

  【例9-9】编一个程序,完成磁盘文件复制。源文件名和目标文件名随程序运行时输入。例如,复制a盘根目录下的文件ccw1.txt为a盘根目录下的ccw2.txt,则执行程序时输入的命令行如下:程序名 a:\ccw1.txt a:\ccw2.txt↙。

  程序清单如下:

    #include "stdio.h" /*程序中用到文件处理类函数*/
    main(int argc,char *argv[])
    { FILE *fp1,*fp2;
    if ((fp1=fopen(argv[1],"rb"))==NULL)
      { printf(“"file can not open!\n");
      exit(0);
    } /*以只读方式打开argv[1]指向的源文件名对应的二进制文件*/
    if ((fp2=fopen(argv[2],"wb"))==NULL)
      { printf("file can not open!\n");
      exit(0);
    } /*以只写方式打开argv[2]指向的目标文件名对应的二进制文件*/
    while(!feof(fp1)) /*复制源文件到目标文件*/
      fputc(fgetc(fp1),fp2);
    fclose(fp1); /*关闭fp1所指向的源文件*/
    fclose(fp2); /*关闭fp2所指向的目标文件*/
    }