wally-ye

main函数参数的用法

main函数参数的用法

main函数的声明
int main(int argc, char **argv)
或者
int main(int argc, char *argv[])
依据《C程序设计语言(第二版.新版)》的讲述:
第一个参数(习惯上称为argc,用于参数计数)的值表示运行程序时,命令行中参数的数目;
第二个参数(称为argv,用于参数的向量)是一个指向字符串数组的指针,其中每个字符串对应一个参数。

例子是在命令行模式下,在命令提示符$后输入:
$ echo hello,world
则会显示:
hello,world
$ (提示符,等待输入命令)

下面用C语言实现这个echo的程序:

//使用书中的第一个版本程序,文件名保存为 echo.c
#include <stdio.h>
/* echo command-line arguments; 1st version */
int main(int argc, char *argv[])
{
   int i;
   for (i = 1; i < argc; i++)
       printf("%s%s", argv[i], (i < argc-1) ? " " : "");
   printf("\n");
   return 0;
}
//编译,运行,结果什么也没有。

令行参数,进入到编译后产生可执行 echo 文件的目录,然后在命令提示符后输入:
$ ./echo hello,world
程序就会运行出来结果:
hello,word
$ (提示符,等待输入命令)

C语言约定:argv[0]的值是启动该程序的程序名,因此argc的值至少为1。
如果argc的值是1,说明程序名后面没有命令行参数。

《Linux高级程序设计(第二版)》中也有一个简单的main函数的例子。
//factorial.c的源程序
#include<stdio.h>
#include<stdlib.h>
int factorial(int n)
{
   if(n<=1)
return 1;
   else
return factorial(n-1)*n;//函数的经典递归调用
}
编译,生成factorial.o
//main.c源程序
#include<stdio.h>
#include<stdlib.h>
int factorial(int n);
int main(int argc, char **argv)   //使用带参数的main函数
{
   int n;
   if(argc<2)//如果argc的值是1,说明程序名后面没有命令行参数
{
    printf("Usage:%s\n",argv[0]);
    //argv[0]的值是启动该程序的程序名
    return -1;
}
   else
{
    n=atoi(argv[1]);//argv[1]读取的是第一个参数,atoi将数字字符转化为数字
    printf("Factorial of %d is %d .\n",n,factorial(n));
}
   return 0;
}
编译生成 main.o
然后在命令行将main.o 和factorial.o连接生成 factorial可执行程序,并测试带参数和不带参数执行:
$ gcc -o factorial main.o factorial.o //连接成可执行程序factorial
$ ./factorial     //不带参数执行factorial
Usage:./factorial    //结果返回输入的执行程序名
$ ./factorial 3     //带参数执行factorial,参数是3
Factorial of 3 is 6 .    //参数3被带到函数中,并执行函数操作,返回正确的值
$ ./factorial 3 4 5    //带参数执行factorial,参数3、4和5
Factorial of 3 is 6 .    //结果只执行第一个参数(函数中只调用第一个参数),其他参数忽略
$ (提示符,等待输入命令)

将它们转化为一个函数,在Windows下面试试:
#include<stdio.h>
#include<stdlib.h>
int factorial(int n)
{
   if(n<=1)
return 1;
   else
return factorial(n-1)*n;//函数的经典递归调用
}
int main(int argc, char **argv)   //使用带参数的main函数
{
   int n;
   if(argc<2)//如果argc的值是1,说明程序名后面没有命令行参数
{
    printf("Usage:%s\n",argv[0]);
       //argv[0]的值是启动该程序的程序名
       getch();
    return -1;
}
   else
{
    n=atoi(argv[1]);//argv[1]读取的是第一个参数,
    //atoi将数字字符转化为数字
    printf("Factorial of %d is %d .\n",n,factorial(n));
}
getch();
   return 0;
}
编译,连接,生成factorial.exe
进入生成目录,在DOS命令行执行:
>factorial.exe
Usage:factorial.exe

>factorial.exe 3
Factorial of 3 is 6.

>factorial.exe 4 5 6
Factorial of 4 is 24.

>(提示符,等待输入命令)
我们再修改一下这个程序,让它读取所有输入的参数
//文件名修改为 fac.c
#include<stdio.h>
#include<stdlib.h>
int factorial(int n)
{
   if(n<=1)
return 1;
   else
return factorial(n-1)*n;//函数的经典递归调用
}
int main(int argc, char **argv)   //使用带参数的main函数
{
   int n;
   int i;//加入循环控制变量
   if(argc<2)//如果argc的值是1,说明程序名后面没有命令行参数
{
    printf("Usage:%s\n",argv[0]);
       //argv[0]的值是启动该程序的程序名
       getch();
    return -1;
}
   else
for(i=1;i<=argc;i++)
{
    n=atoi(argv[i]);//argv[i]读取的是第i个参数,
    //atoi将数字字符转化为数字
    printf("Factorial of %d is %d .\n",n,factorial(n));
}
getch();
   return 0;
}
编译,连接后生成fac.exe
再到命令行下进行测试:
>fac.exe
Usage:fac.exe

>fac.exe 3
Factorial of 3 is 6.
Factorial of 0 is 1.

>fac.exe 4 5 6
Factorial of 4 is 24.
Factorial of 5 is 120.
Factorial of 6 is 720.
Factorial of 0 is 1.

>(提示符,等待输入命令)
多出来一个
Factorial of 0 is 1.
原来是这里,多循环了一次,
for(i=1;i<=argc;i++)
修改为
for(i=1;i<argc;i++)
再试验一次(记得重启CMD,不然还是载入原来的程序):
>fac.exe
Usage:fac.exe

>fac.exe 3
Factorial of 3 is 6.

>fac.exe 4 5 6
Factorial of 4 is 24.
Factorial of 5 is 120.
Factorial of 6 is 720.

>(提示符,等待输入命令)

posted on 2011-04-07 01:31 wally_ye 阅读(2416) 评论(0)  编辑 收藏 引用


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   博问   Chat2DB   管理