Как вырастить 2d динамически размещенный строковый массив в C++11?

Итак, я занимался этим вопросом: В. Напишите программу, которая позволяет пользователям отслеживать последний раз, когда они разговаривали с каждым из своих друзей. Пользователи должны иметь возможность добавлять новых друзей (столько, сколько они хотят!) И хранить количество дней назад, когда они последний раз общались с каждым другом. Пусть пользователи также обновят это значение.

Я создал указатель на указатель user_friends для хранения двумерного массива строк для имен друзей и нет. дней с момента последнего разговора. Это массив 3х2 изначально для 3 друзей. 2 столбца хранят имя друга и нет. дней (оба в массиве указателей строкового типа).

Мой главный имеет это:

int tsize = 3;
string **user_friends = new string*[tsize];

for ( int i = 0; i < tsize; i++ )
{
    user_friends[i] = new string[2];
}

Вот функция addFriends для добавления друзей в массив.

 void addFriends( string **user_f , int tsize )
{
static int next_friend = 0;
int index = 0;
string days;

if ( next_friend >= tsize )
    {
        cout << "\nGrowing array now...";
        user_f = growArray ( user_f, tsize );
    }

cout << "\n\nEnter index : ";
cin >> index;
cin.ignore();

cout << "\nEnter friend's name : ";
getline( cin, user_f[index][0] );

cout << "\nEnter days since last talked with this friend : ";
getline (cin, days);
user_f[index][1] = days;

next_friend++;

}

Затем есть функция growArray для расширения памяти, выделенной для массива строк:

 string **growArray ( string **ptr, int cur_size )
{
string **new_ptr = new string*[ cur_size*2 ];

for ( int i = 0; i < cur_size; ++i )
{
    new_ptr[i] = new string[2];
}

for( int i = 0; i < cur_size; ++i )
{
    new_ptr[i] = ptr[i];
}

for ( int i = 0; i < cur_size; ++i )
{
    for ( int j = 0; j < 2; ++j)
    {
        new_ptr[i][j] = ptr[i][j];
    }
}

for ( int i = 0; i < cur_size; ++i )
{
    delete ptr[i];
}

delete[] ptr;
return new_ptr;
}

Затем эта функция отображения для печати массива.

void displayFriends( string **user_f, int tsize )
{
for ( int i = 0; i < tsize; ++i )
{
    for( int j = 0; j < 2; ++j )
    {
        cout << user_f[i][j] << "\t";
    }
    cout << endl;
}

}

Теперь, когда я ввел данные трех друзей, программа работает нормально. Когда я начинаю вводить данные друга 4 (т.е. когда я набираю индекс как 3), программа вылетает. Есть ли проблемы с функцией growArray?

Кроме того, функция дисплея в порядке?

1 ответ

В growArray функционировать первым for цикл должен повторяться от 0 в 2 * cur_size вместо 0 в cur_size,

for(int i = 0; i< 2 * cur_size; i++)
    new_ptr[i] = new string[2] 
Другие вопросы по тегам