【问题标题】:C++ array size by user input用户输入的 C++ 数组大小
【发布时间】:2016-02-10 17:58:57
【问题描述】:

我正在尝试编写一个程序,该程序将具有用户输入的数组大小,然后将值放入该数组。我最初尝试过

int sz = 51;
double Arr[sz];

这会导致编译错误。显然,变量的动态分配必须发生,如果可能的话,我宁愿避免这种情况。所以我修改了我的代码(当前状态如下所示),现在只抛出“']'令牌之前的预期主表达式”。有没有办法解决这个问题而我只是没有看到它,还是我需要使用动态分配?

感谢您的宝贵时间!

#include <iostream>
#include <iomanip> //for setprecision

using namespace std;

int sz = 51;
double n=0;
double Arr[0];

void get_input(double Arr[], int &sz){  //gets input
do{
    cout<< "Enter size: "<< endl;
    cin>> sz;
    if (sz<0 || sz>50){
        cout<< "Invalid size, enter a value between 0 and 50"<<endl;
    }
}while(sz<0 || sz>50);

for( int i=0; i<sz; i++){
    cin>> Arr[i];
}
}

double calcSum( double Arr[], int sz){ //finds sum
for(int i=0; i<sz; i++){
    n+= Arr[i];
}
return(n);
}

void printArray(double Arr[], int sz){ //prints array elements
for(int i=0; i<sz; i++){
    cout<< Arr[i]<< setprecision(2)<<" ";
    if(i%7 == 0)
        cout<< endl;
}
}


int main()
{
double Arr[sz];
get_input(Arr[], sz); //error here
printArray(Arr[], sz); //error here

    return 0;
}

【问题讨论】:

  • 您的错误是get_input(Arr[]) 没有意义。 Arr 已经是一个数组,你不需要一直把[] 放在那里,除非你想使用下标运算符。此外,sz 仍然不是常量表达式。将其设为const int sz = 51; 即可。减去您尝试修改的部分sz
  • 这是用于什么编译器的?
  • 这是 GNU GCC 编译器

标签: c++ arrays function dynamic


【解决方案1】:

只需使用std::vector,C++ 中有一个标准库就是因为这个原因。

演示:

  • 注意:您不需要全局变量(它们被本地变量遮蔽,无论如何您都通过引用传递它们)

Live On Coliru

#include <iostream>
#include <iomanip>
#include <vector>

using namespace std;
using array_t = std::vector<double>;

void get_input(array_t& Arr) { // gets input
    size_t sz = 51; // unsigned types cannot be negative
    do {
        cout << "Enter size: " << endl;
        cin >> sz;
        if (sz > 50) {
            cout << "Invalid size, enter a value between 0 and 50" << endl;
        }
    } while (sz > 50);

    for (size_t i = 0; i < sz; ++i) {
        double v;
        if (cin >> v)
            Arr.push_back(v);
        else
            std::cerr << "Error reading input\n";
    }

    //assert(sz = Arr.size());
}

double calcSum(array_t const& Arr) { // finds sum
    double n = 0;
    for (size_t i = 0; i < Arr.size(); ++i) {
        n += Arr[i];
    }
    return n;
}

void printArray(array_t const& Arr) { // prints array elements
    for (size_t i = 0; i < Arr.size(); ++i) {
        cout << Arr[i] << setprecision(2) << " ";
        if (i % 7 == 6)
            cout << endl;
    }
}

int main() {
    array_t Arr;
    get_input(Arr);
    printArray(Arr);
    std::cout << "\nSum: " << calcSum(Arr) << "\n";
}

当输入3 1 2 3 时,您会得到:

Enter size: 3
1 2 3
1 2 3
Sum: 6

【讨论】:

  • 是的,我还没有完全准备好与全局变量混淆的数量,而且我不喜欢在我还在测试时发布它。 @πάνταῥεῖ
  • 我最近大部分时间都在表现相似,也是因为我的平板电脑有点受限(这也是我最近拒绝聊天的原因,这并不好笑或令人满意该设备)。
【解决方案2】:

VLAs(例如Arr[sz])仅支持作为 C++ 中的扩展。它们不是官方语言标准的一部分。你应该改用std::vector

【讨论】:

  • OP 肯定不知道(也不需要知道)什么是 VLA,并且可能不知道您所说的“扩展”是什么意思。你最好解释一下,或者更好的是,删除它。
  • 我同意,但我认为这是一个很好的答案,应该删除。如果我们不告诉,OP 将永远知道 :) 我倾向于假设好奇和渴望学习的 OP
  • 我不关心术语,但它不是语言标准的一部分,你不应该使用它。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-04-17
相关资源
最近更新 更多