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.
>(提示符,等待输入命令)