-7

omgimは今とても混乱しています

ここで何が間違っているのか、それを修正するために何ができるのか

編集:うーん、ごめんなさい...私は今とても変動しているので質問すらできません

入力された10個のchar文字列をポインタ配列に割り当てたい。

using namespace std;

int main(int argc, char *argv[])
{
    char *mess[10];
    int i = 0;

for (; i < 10; i++)
{                 
    cout << "Enter a string: ";   
    cin.getline(mess[i], 80);
}

for (i = 0; i < 10; i++)
    cout << mess[i];

system("PAUSE");
return EXIT_SUCCESS;
}
4

3 に答える 3

3

必要なのは、おそらく次のように配列を宣言することです。

char mess[10][80];

getlineから最大80文字を読み取っています。

現在の実装では、char*割り当てられたバッファを指すように初期化されることのない10個の配列を作成します。

std::stringバッファサイズが自動的に処理されるため、はるかに安全な方法を使用することです。簡単な変更:

#include <iostream>
#include <string>
using namespace std;

int main(int argc, char *argv[])
{
    std::string mess[10];
    int i = 0;

    for (; i < 10; i++)
    {                 
        cout << "Enter a string: ";   
        cin >> mess[i];
    }

    for (i = 0; i < 10; i++)
        cout << mess[i] << endl; // you probably want to add endl here

    system("PAUSE");
    return EXIT_SUCCESS;
}

あなたが望むものをあなたに与えるべきです。

編集

どうしても必要な場合char *(これは良い考えではありません)、探しているものは次のとおりです。

#include <iostream>
using namespace std;

int main(int argc, char *argv[])
{
    char* mess[10];
    int i = 0;

    for (; i < 10; i++)
    {                 
        cout << "Enter a string: ";   
        mess[i] = new char[80]; // allocate the memory
        cin.getline(mess[i], 80);
    }

    for (i = 0; i < 10; i++)
    {
        cout << mess[i] << endl;
        delete[] mess[i]; // deallocate the memory
    }

    // After deleting the memory, you should NOT access the element as they won't be pointing to valid memory

    system("PAUSE");
    return EXIT_SUCCESS;
}
于 2013-01-13T19:40:43.213 に答える
2

10個のポインターを割り当てていますが、getlineが入力を読み取ることができるスペースを指すようにポインターを初期化することは決してありません。

于 2013-01-13T19:38:25.513 に答える
2

最初に、ここで宣言しているポインタを初期化してchar *mess[10];、それらにメモリを割り当てる必要があります。これを行うには、new()式を使用して、要求されたメモリを割り当てます。

char *mess[10];
for (int k=0; k<10; k++)
{
    mess[k]=new char[80];
}

関数を使用してメモリをnew()割り当てた後は、データの処理が完了した後、常に使用されているメモリの割り当てを解除する必要があることに注意してください。delete()式を使用して、メモリの割り当てを解除することができます(常にそうする必要があります)。

for (int j=0; j<10; j++)
{
   delete[] mess[j];
}

メモリの動的な割り当て/割り当て解除の詳細については、こちらを参照してください。

于 2013-01-13T19:43:11.360 に答える