0

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

这是我的代码:

#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

4 回答 4

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;
}
于 2013-01-18T04:51:47.040 回答
2

您可以通过这种方式声明您的 namesArray:

string * namesArray = new string[a];

这应该可以工作,因为它根据输入值 a 动态分配内存。

但可以肯定的是,最好改用矢量。如果使用向量,则不需要删除数组。

于 2013-01-18T04:53:49.173 回答
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;
}
于 2013-01-18T04:55:56.640 回答
0

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

所以,你的代码将是string* namesArray = new string[a];

Usingnew返回指向数组的指针,因此请相应地进行调整。

于 2013-01-18T04:56:02.127 回答