我正在尝试设置一个字符串数组,其大小和内容取决于用户输入。我收到一个声明我的数组的错误,它说大小的变量不是正确的类型。我花了几个小时就想到了这个问题。
这是我的代码:
#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];
答案 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
返回指向数组的指针,因此请相应调整。