int main();
int main(int argc, char *argv[]);
前面的教程中我们一直使用第一种原型,它简单易懂,能让初学者很快入手。第二种原型在实际开发中也经常使用,它能够让我们在程序启动时给程序传递数据。
一个程序在启动时允许系统或用户给它传递数据,Windows 和 Linux 都支持,这些数据以字符串的形式存在,多份数据之间以空格分隔。也就是说,用户输入的多份数据在程序中表现为多个字符串。
给程序传递数据的一种方法就是从控制台运行程序,在 Windows 下就是从 cmd(命令提示符程序)运行,在 Linux 下就是从终端(Terminal)运行,本节以 Windows 为例讲解。
在第二个原型中,argc 表示传递的字符串的数目,argv 是一个指针数组,每个指针指向一个字符串(一份数据)。我们来看一个具体的例子:
#include <stdio.h>
int main(int argc, char *argv[]){
int i;
printf("The program receives %d parameters:\n", argc);
for(i=0; i<argc; i++){
printf("%s\n", argv[i]);
}
return 0;
}
将生成后的程序放在D:\目录下,命名为demo.exe,打开 cmd(命令提示符程序),输入D:\demo.exe 城东书院 www.cdsy.xyz C-Lang,程序的运行结果如下:
从运行结果可以看出,包括程序名以及它后面的字符串都会被程序所接收。去掉后面的数据,只输入程序名:
再次证明了程序名也会被传递给程序本身。cd 到程序所在目录,只输入程序名(不包含路径)就可以运行程序:
可以看到,程序名不包含路径。
main() 函数的第二种原型有非常实际的应用,在 Linux 中,每个 Shell 命令都需要一个程序来解释,如果这个程序是由C语言编写的,那么 main() 函数就可以接收这个命令以及它后面附带的参数。
【实用程序】判断用户输入的是否是素数。
#include <stdio.h>
#include <math.h>
#include <stdlib.h>
int isPrime(int n);
int main(int argc, char *argv[]){
int i, n, result;
if(argc <= 1){
printf("Error: no input integer!\n");
exit(EXIT_SUCCESS);
}
for(i=1; i<argc; i++){
n = atoi(argv[i]);
result = isPrime(n);
if(result < 0){
printf("%3d is error.\n", n);
}else if(result){
printf("%3d is prime number.\n", n);
}else{
printf("%3d is not prime number.\n", n);
}
}
return 0;
}
//判断是否是素数
int isPrime(int n){
int i, j;
if(n <= 1){ //参数错误
return -1;
}else if(n == 2){ //2是特例,单独处理
return 1;
}else if(n % 2 == 0){ //偶数不是素数
return 0;
}else{ //判断一个奇数是否是素数
j = (int)sqrt(n);
for(i=3; i<=j; i+=2){
if (n % i == 0){
return 0;
}
}
return 1;
}
}
在 cmd 中的运行效果截图: