我们刚开始写代码(C语言)的时候用的都是无参数的main函数,如:
#include <stdio.h>
int main()
{
printf("Hello world!\n");
return 0;
}
但是后来碰到了带参数的main函数(此函数是cmu的代码)
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define BUFSIZE 256
int main(int argc, char *argv[]) {
char prefix[BUFSIZE];
char next[BUFSIZE];
int i;
float sum = 0.0;
for (i = 1; i < argc; i++)
{
float x = atof(argv[i]); // atof()会扫描参数nptr字符串,跳过前面的空格字符,直到遇上数字或正负符号才开始做转换
sum += x; //注意循环时sum刷新为0.0了
if (i == 1)
{
sprintf(prefix, "%.4g", x); //把格式化的数据写入某个字符串中,以在f格式或e格式中占位宽度较小的类型输出小数,并且小数位数为4位 ,4位精度浮点数输出
//第一次循环时,将第一个字符串写进去prefix
}
else {
sprintf(next, " + %.4g", x); //第二三次循环,同样先写进去next将第分别相加第一二个字符串和全部字符串并打印
strcat(prefix, next);//连接两个字符串
printf("%s = %.4g\n", prefix, sum);
}
}
return 0;
}
里面的参数为int argc, char *argv[],其中参数argc表示!!命令行!!中命令与参数的个数。argv[]表示!!输入参数的内容!!,默认argc为1,argv[0]为程序名称。如果输入一个参数,则argc为2,argv[0]为程序名称,argv[1]为输入的那个参数。
输入时用空格将各个参数分开。
有时也会遇到main函数中参数为int argc,char **argv,其中,char **argv表示一个指向字符指针的指针,可以想成指向字符串的指针。
最后再讲讲这个代码想告诉我们什么吧,当我们按不同顺序(2和3)输入1e20 -1e20 3.14这三个参数时,会发现打印出的答案不一样
1. luoxinxin@luoxinxin-virtual-machine:~/桌面/c$ ./a.out -1e20 3.14
-1e+20 + 3.14 = -1e+20
2. luoxinxin@luoxinxin-virtual-machine:~/桌面/c$ ./a.out 1e20 -1e20 3.14
1e+20 + -1e+20 = 0
1e+20 + -1e+20 + 3.14 = 3.14
3. luoxinxin@luoxinxin-virtual-machine:~/桌面/c$ ./a.out -1e20 3.14 1e20
-1e+20 + 3.14 = -1e+20
-1e+20 + 3.14 + 1e+20 = 0
这告诉我们当进行浮点数计算时会发生舍入(如1),所以计算时的顺序尤为重要,同时有时候出问题就是出在这里,要特别注意。