main函数不同写法
以下为main函数的6种不同写法:
main(){} //NO.1
void main(){} //NO.2
int main(){} //NO.3
int main(void){} //NO.4
int main(int argc,char *argv[]){} //NO.5
int main(int argc,char **argv){} //NO.6
- NO.1在C90标准下可以正常编译,而在C99和C11标准下会抛出一个警告(不写返回值,默认的返回值为int,也就相当于NO.1和NO.3等价)
- NO.2-6在C90、C99、C11标准下均能正常编译
- NO.4、5、6才是main函数的规范写法(NO.5等价于NO.6)
从1972年C语言被设计出来到C90标准发布这段时间,对C语言不同的实现就导致了对main函数的差异性。强烈不推荐写法2,因为main函数是被操作系统调用的,操作系统会根据main函数的返回值来判断程序的正确执行与否,如果返回void,那代表的是什么状态呢?而且一些编译器支持这种写法,一些编译器不支持,所有的标准并未认可这种写法。
main参数解析
参数1:int argc
用于存放命令行参数的个数
参数2:char *argv[]
是个字符串的数组,每个元素都是一个字符指针,指向一个字符串 //首先从 argv 处开始,先与[]结合,因为其优先级比高,所以 argv 是一个数组,然后再与 * 结合,说明数组里的元素是指针类型,然后再与 char 结合,说明指针所指向的内容的类型是字符型的
参数2:char **argv
//首先从 argv 开始,先与 * 结合,因此 argv 是一个指针,然后再与 * 结合,说明指针所指向的元素是指针,然后再与 char 结合,说明该指针所指向的元素是整型数据.
argv[0]
代表程序名argv[1]
到argv[argc-1]
代表程序参数 - 参数的命名
argc
和argv
是程序员的约定,你也可以用 argd 或 args,但是不建议这么做
例1:传入参数 aaa bbb ccc ddd
#include<iostream>
int main(int argc,char **argv)
{
//显示参数的个数
printf("argc is %d \n",argc);
//列出全部参数
for(int i=0;i<argc;i++){
printf("argv[%d] is %s \n",i,argv[i]);
}
}
结果:
例2:传入参数0
#include <iostream>
#include <string>
#include <cstdlib>
using namespace std;
int main(int argc,char **argv)
{
if(argc!=2)
{
printf("请输入0~2选择一个职业 \n");
printf("模式0::牧师 \n");
printf("模式1::战士 \n");
printf("模式2::术士 \n");
return -1;
}
int mode=atoi(argv[1]);
switch(mode)
{
case 0:
printf("你选择了牧师 \n");
break;
case 1:
printf("你选择了战士 \n");
break;
case 2:
printf("你选择了术士 \n");
break;
default:
printf("你没有选择职业 \n");
}
string s="2147483648";
printf("s=%d \n",atoi(s.c_str()));
}
atoi函数
- 将
string
字符串转换为int
类型,只能转换为十进制; atoi
函数不会对string
字符串进行范围检查[-2147483648,2147483647],超过这个界限,不会报错,只会进行相应的转换,遇到非法字符会停止(遇到非数字时会停止),不会报错;- 头文件为
#include<cstdlib>
atoi(string.c_str())
把string
转换为char*
后才能传入作为atoi函数的参数
int atoi( const char *str );