将可变数量的参数传递给函数调用(C++)[英] Passing Variable Number of Arguments to a Function Call (C++)

本文是小编为大家收集整理的关于将可变数量的参数传递给函数调用(C++)的处理方法,想解了将可变数量的参数传递给函数调用(C++)的问题怎么解决?将可变数量的参数传递给函数调用(C++)问题的解决办法?那么可以参考本文帮助大家快速定位并解决问题。

问题描述

我正在尝试将可变数量的参数传递给函数.我已阅读 Ivor Horton 的"Beginning C++ 2005"中的代码并在线搜索,但所有示例都通过代码传递变量,但是我希望从用户输入传递变量(代码不应该知道传递了多少变量直到用户输入它们).我希望你们能得到我.

我编写了一个简单的程序来计算用户输入的数字的平均值,它将它们存储在一个数组中.现在我希望将数组中的项目作为函数的参数读取.

我知道有更好的方法来实现平均值,但我的重点是学习将可变数量的参数传递给函数的概念.下面是我的代码,它工作正常,并接受用户的输入,将给定的数字存储在一个数组中,最多 20 个数字.我想将这些数字传递给同样定义的平均函数.

//求数字的平均值//演示将可变数量的参数传递给函数调用#include <iostream>#include <字符串>#include <sstream>#include "stdarg.h"使用 命名空间 std;double 平均数(int count,...);//函数原型int main(){double Number = 0.00;//实例化一个双精度浮点值int count = 0;//保持用户条目计数的整数字符串输入 = "";//获取用户输入的字符串double 数字[20];//存储用户输入数字的数组while ((input !="x") && (input !="X") && (count <20)) //除非用户输入"X"或20个数字,否则存储该数字并要求另一个{while(true){cout<"请输入给定数字:";getline(cin,input);//获取用户输入if((input=="X")||(input=="x"))//如果用户输入了 X,则中断(因为如果输入是 X 则不会运行循环......){cout <<endl<<"你结束了序列";break;}串流我的流(输入);if (mystream >> Number)//If用户输入一个有效数字,中断break;cout<"无效号码,请重试";}数字[计数] = 数字;//将当前输入的数字存储在数组中的相关位置计数++;//增加计数器}}double 平均值(int 计数,...){if (count<=0)//如果 count 不是大于零的整数,则返回 0.0 作为平均值{return 0.0;}va_list plist;//声明一个指向参数列表的指针va_start(plist,count);//先计算总和double sum = 0.0;//声明双精度浮点数来存储所有数字的总和for(int i=0;i<计数;i++){sum += va_arg(plist, int);//对于每个数字,将其添加到总和中}va_end(plist);//将指针重置为空double avg = sum/count;//声明双精度浮点数并将其赋值为 Sum/Count 即平均值return avg;//返回平均值}

推荐答案

这是一个有趣的问题,但是这个例子可能不适合解释这个问题.实际上,对于平均值,您不会传递不同数量的参数,而是传递一个可能具有不同大小的参数(数组).对于这种情况,您应该使用
std::vector<int>Numbers;
一个向量可以很容易地动态扩展(例如根据一些用户输入).例如,输入值的数量可以由向量的 size() 运算符确定:
Numbers.size()


但我很确定这不是您想要做的(尽管它可能是您问题的另一种解决方案?).

您希望用户在程序运行期间定义调用函数的参数吗?

可变参数函数是危险的,它们是无类型的并且容易被滥用.您应该尽可能避免使用它们.如果您在界面中为其他编码人员提供可变参数函数,那么他们通常会犯难以发现的错误.如果您要传递可变数量的参数,请通过以下方式之一执行此操作:
- 如果您必须传递参数的副本,则传递整个容器
- 如果您不必复制项目,则将 (const) 引用传递给容器
- 如果您不必复制项目,最好的解决方案:传入数据的开始和结束迭代器

在最里面的范围内声明你的变量,可能是你第一次使用它的地方,而不是在你的函数体的开头!

#include <cstdio>#include <vector>#include <cassert>模板 <typename ItemType, typename Iterator>ItemType 平均(迭代器在前,迭代器在后){断言(第一个 < 最后一个);ItemType count = (ItemType)(last - first);项目类型总和 = 项目类型();while (first < last)总和 += *first++;return 总和/计数;}int main(){static const double DOUBLE_ARRAY[] = {1.1, 3.3, 4.4 };static const int INT_ARRAY[] = {1, 3, 4 };printf("浮点数组平均值:%Lf\n", Average(DOUBLE_ARRAY, DOUBLE_ARRAY+sizeof(DOUBLE_ARRAY)/sizeof(DOUBLE_ARRAY[0])));printf("int 数组平均值:%d\n", Average(INT_ARRAY, INT_ARRAY+sizeof(INT_ARRAY)/sizeof(INT_ARRAY[0])));std::vector<浮点数>浮动;printf("请输入浮点值,然后输入 X 以打印输入值的平均值!\n");for (;;){char buf[0x100];if (!fgets(buf, sizeof(buf), stdin))return 1;if (!strcmp("x\n", buf) || !strcmp("X\n", buf))break;浮动 f;if (1 != sscanf(buf, "%f", &f))printf("无效浮点值:%s\n", buf);其他浮动.push_back(f);}if (floats.empty())printf("没有项目.\n");其他printf("%d 个浮点值的平均值:%f\n", (int)floats.size(), Averagereturn 0;}

看我的问题:
http://stackoverflow.com/q/12263745/1000282[^]

并回答:
http://stackoverflow.com/a/12267468/1000282[^]

在 StackOverflow.我认为你不需要那个,因为你是一个初学者,在处理类似的事情之前你应该对语言有一种感觉.但是,无论如何,很高兴知道.

本文地址:https://www.itbaoku.cn/post/1355849.html