前言
在ubuntu下使用g++编译器,实现在命令行输入 数量可变个参数 进行累加或求平均
本来想用变参函数的,但是不知道怎么将命令行的参数变成变参函数的参数,于是直接使用数组作为参数了。
利用知识
main函数的参数使用
int main(int argc,char* argv[])
argc:int类型,表示命令行的参数总个数
argv:char**类型,存储了命令行的全部参数
argv[0]:存储了第一个参数的字符串指针:执行文件的所在目录,
如执行当前目录下的执行文件test: ./test 则*argv[0]=./test
如在终端输入命令行 ./test sum 1 2 3
*argv[0]=./test *argv[1]=sum *arg[2]=1 *argv[3]=2 *argv[4]=3
功能实现过程
1、创建文件
touch test.cpp
vi test.cpp
2、写代码
#include<iostream>
#include<string>
using namespace std;
//累加函数,参数为数组个数和指向数组的指针
double sum(int count,double arr[])
{
double sum=0.0;
for(int i=0;i<count;i++)
sum+=arr[i];
return sum;
}
//求平均函数,参数为数组个数和指向数组的指针
double avg(int count,double arr[])
{
double sum=0.0;
for(int i=0;i<count;i++)
sum+=arr[i];
return sum/(count*1.0);
}
//argc:int类型,表示命令行的参数总个数
//argv:char**类型,存储了命令行的全部参数
int main(int argc,char* argv[])
{
//获取命令行第二个参数,该参数为使用的函数名
string str1=argv[1];
//创建数组空间,argc-2个数,argv[0]和argv[1]为目录和函数名
double *arr=new double[argc-2]();
//获取命令行中的数组元素
for(int i=0;i<argc-2;i++)
{
string sarr=argv[i+2];
//string转double
arr[i]=stod(sarr);
}
//使用sum函数
if(str1=="sum")
{
cout<<"used function:---sum---"<<endl;
double arr_sum=sum(argc-2,arr);
cout<<"the count is "<<argc-2<<endl;
cout<<"result:"<<arr_sum<<endl;
}
使用avg函数
if(str1=="avg")
{
cout<<"used function:---avg---"<<endl;
double arr_avg=avg(argc-2,arr);
cout<<"the count is "<<argc-2<<endl;
cout<<"result:"<<arr_avg<<endl;
}
cout<<"执行文件所在目录:"<<argv[0]<<endl;
//释放空间
delete []arr;
arr=NULL;
return 0;
}
3、使用g++编译器编译
g++ test.cpp -std=c++11 -o test
4、执行
输入命令 ./test sum 1 2 3
结果:6
输入命令 ./test avg 1.1 1.1 1.1 1.1 1.1 1.1
结果:1.1
遇到的问题
1、g++支持的c++版本问题
使用了string转化为double的函数stod(string),需要c++11
解决:编译时加入-std=c++11 即可:g++ test.cpp -std=c++11 -o test
2、数字和string类型的转化问题
string类型转化为double型函数:double stod(string str);
string类型转化为int型函数: int stoi(string str);