C ++根据用户输入声明一个包含内容和大小的字符串数组

时间:2013-01-18 04:50:41

标签: c++ xcode dynamic

我正在尝试设置一个字符串数组,其大小和内容取决于用户输入。我收到一个声明我的数组的错误,它说大小的变量不是正确的类型。我花了几个小时就想到了这个问题。

这是我的代码:

#include <iostream>
#include <string>

using namespace std;

int main()
{
    cout << "Enter number of names /n";
    int a;
    cin >> a;
    string namesArray[a];         //Error is here.
    for( int i=0; i<a; i++) {
        string temp;
        cin >> temp;
        namesArray[i] = temp;
    }

    for( int j=0; j<a; j++) {
        cout << "hello " << namesArray[j] << "/n";

    }
    return 0;
}

错误发生在string namesArray[a];

4 个答案:

答案 0 :(得分:3)

数组需要具有其大小的编译时值。您的代码不会编译,因为a不是编译时常量。

更好地使用std::vector

#include <iostream>
#include <string>
#include <vector>   // <-- Must be included

using namespace std;

int main()
{

    cout << "Enter number of names /n";
    int a;
    cin >> a;

    vector<string> namesArray;    // HERE!!!

    for( int i=0; i < a; i++) {
        string temp;
        cin >> temp;
        namesArray.push_back(temp);   // Notice the difference
    }

    for( int j=0; j<a; j++) {
        cout << "hello " << namesArray[j] << "/n";
    }

    return 0;
}

答案 1 :(得分:2)

您可以这样声明您的namesArray:

string * namesArray = new string[a];

这应该有效,因为它根据输入值a。动态分配内存。

但当然,最好使用矢量代替。如果使用矢量,则无需删除数组。

答案 2 :(得分:0)

你不能将变量用作静态数组的大小,要做到这一点你需要动态分配你的数组,比如

string* namesArray =  new string[a];

但是更明智的做法是使用std :: vector来避免内存泄漏!

使用矢量,您可以这样做:

#include <iostream>
#include <string>
#include <vector>

using namespace std;

int main()
{
    cout << "Enter number of names /n";
    int a;
    cin >> a;
    vector<string> names;
    for( int i=0; i<a; i++) {
        string temp;
        cin >> temp;
        names.push_back(temp);
    }

    vector<string>::iterator
        it = names.begin(),
        ite = names.end();
    for(; it != ite; ++it) {
        cout << "hello " << *it << "/n";
    }

    return 0;
}

答案 3 :(得分:0)

正如Mark所说,这是一个编译时问题。您可以使用vector,但另一种方法是为数组动态分配内存。这意味着使用关键字new

因此,您的代码将为string* namesArray = new string[a];

使用new返回指向数组的指针,因此请相应调整。