该代码当前接受数据条目数量的输入和以单个空格分隔的数量输入。我的目的是获取数据并将其转换为数组,但是每当我尝试使用格式
时int array[ndata];
由于变量ndata不是恒定的,因此版本包含错误。如何更改数组大小的输入以实现此目的?
代码:
#include "pch.h"
#include <iostream>
#include <string>
using namespace std;
int main()
{
const int MAXDATA = 100;
bool ok = 1;
double sum = 0, x, data[MAXDATA];
double min = 1e32, max = -1e32;
int ndata = 0;
int count = 0;
while (ok)
{
cout << "Enter number of data to input then press <Enter>: ";
cin >> ndata;
if (ndata > 0 && ndata < MAXDATA) ok = 0;
cout << "Enter numbers separated by a single space, then press <Enter>: ";
count = 0;
while (count < ndata)
{
cin >> x;
data[count] = x;
sum = sum + x;
count++;
cout << "sum is " << sum << endl;
}
}
}
答案 0 :(得分:1)
有两种方法可以处理此问题。
第一种方法是在您打算使用它们的位置附近声明变量。这是很有用的事情,因为当声明和使用彼此接近时,它使读取代码变得更加容易。看起来像这样:
#include <iostream>
#include <string>
using namespace std;
int main(){
const int MAXDATA = 100;
bool ok = 1;
double sum = 0, x;
double min = 1e32, max = -1e32;
int ndata = 0;
int count = 0;
while (ok) {
cout << "Enter number of data to input then press <Enter>: ";
cin >> ndata;
if (ndata > 0 && ndata < MAXDATA) ok = 0;
cout << "Enter numbers separated by a single space, then press <Enter>: ";
count = 0;
double data[ndata];
while (count < ndata) {
cin >> x;
data[count] = x;
sum = sum + x;
count++;
cout << "sum is " << sum << endl;
}
}
}
请注意,您需要添加一些其他检查以确保ndata
不大于MAXDATA
。
之所以有效,是因为data
是在初始化ndata
之后声明的。请注意,如果不检查以确保ndata
小于MAXDATA
,则可能会导致堆栈溢出。
更好的方法是在堆上分配data
数组。这使您可以将其设置为所需的最大大小(取决于操作系统和硬件的限制)。但是,确实需要格外小心,以确保在使用完数据后将其释放。看起来像这样:
#include <iostream>
#include <string>
using namespace std;
int main(){
const int MAXDATA = 100;
bool ok = 1;
double sum = 0, x;//, data[MAXDATA];
double min = 1e32, max = -1e32;
int ndata = 0;
int count = 0;
while (ok) {
cout << "Enter number of data to input then press <Enter>: ";
cin >> ndata;
if (ndata > 0 && ndata < MAXDATA) ok = 0;
cout << "Enter numbers separated by a single space, then press <Enter>: ";
count = 0;
double *data = new double [ ndata ];
while (count < ndata) {
cin >> x;
data[count] = x;
sum = sum + x;
count++;
cout << "sum is " << sum << endl;
}
delete [] data;
}
}
答案 1 :(得分:0)
让我们从构建失败的参考开始:Why aren't variable-length arrays part of the c++ standard? GCC支持可变长度数组,但并非所有编译器都支持。
载体
关于您可以执行的操作,最安全的操作是从数组切换为vectors。 std::vector
本质上是一个动态分配的数组,具有一些便利功能,这意味着您不必担心动态分配。声明向量的典型方法如下:
std::vector<double> data;
data.reserve(ndata);
第二行告诉向量,即使此时向量仍不包含任何元素,也要为其分配足够的空间。不需要保留空间,但是在ndata
大的情况下可以提高性能。
当您要在数组的末尾添加一些内容时,可以使用以下内容:
data.push_back(x);
可以使用类似于数组data[count]
的语法来检索数据。
载体,第2部分
使用向量时,您可能会考虑另一种方法。您可以在指定变量大小的同时声明它。
std::vector<double> data(ndata);
这与第一种方法不同,因为它实际上是(默认)构造ndata
的{{1}}副本。第一个版本分配了空间,但可访问大小保持为零;该版本分配了空间,并说每个条目现在都可以访问。如果执行此操作,则不会添加到向量中,因此不会进行推送。相反,您可以转储double
变量并直接读入向量条目:
x
您还可以保留cin >> data[count];
并将其分配给x
,但是此时data[count]
的方法使事情更加清晰。
向量还可以做更多的事情;希望这足以让您入门。
动态和手动
如果由于某种原因不能使用向量,则可能会自己管理动态内存分配和取消分配。另一个答案可以解决这个问题,因此,在这种情况下,我将只介绍您一个。