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に基づいてメモリを動的に割り当てるため、これは機能するはずです。

しかし確かに、代わりにベクトルを使用する方が良いです。vectorを使用する場合は、配列を削除する必要はありません。

于 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];

を使用newすると配列へのポインタが返されるため、それに応じて調整します。

于 2013-01-18T04:56:02.127 に答える