Динамически размещаемый массив C ++ читает предложение и печатает слова - PullRequest
0 голосов
/ 22 февраля 2019

На входе мы получаем предложение, которое читаем до EOF.Нам нужно добавить отдельные слова в динамический массив и затем написать их по одному в каждой строке.

Ввод: Привет, это пример.

Ввод:

Привет

это,

это

пример

У меня есть следующий код, и я не могу понять, почему он недаже добавить что-нибудь в массив.

#include <iostream>
#include <string>

using namespace std;

void addToArray(string newWord, string myArray[], int& arrayLength)
{
  string * tempArray = new string[arrayLength + 1];
  tempArray[arrayLength] = newWord;

  for (int i = 0; i < arrayLength; ++i)
  {
    myArray[i] = tempArray[i];
  }

  arrayLength++;
  myArray = tempArray;

  delete [] tempArray;
}

int main()
{
  string * arrayOfWOrds = new string[1000];
  int arrayLength = 0;
  string temp;

  while (getline(cin, temp))
  {
    cout << temp << endl;
    addToArray(temp, arrayOfWOrds, arrayLength);
  }

  cout << "Array" << endl;
  for (int i = 0; i < arrayLength; ++i)
  {
    cout << arrayOfWOrds[i] << endl;
  }

}

Ответы [ 4 ]

0 голосов
/ 22 февраля 2019

Я вижу несколько вопросов здесь.Начнем с того, что вы установили arrayLength = 0, поэтому он не будет перебирать весь массив, если в нем уже есть что-то.Если у вас ничего нет, начинать с 1000 предметов бессмысленно.Кроме того, while (getline(cin,temp)) - это бесконечный цикл, поэтому он никогда не закончится и фактически не напечатает массив.Если вы хотите распечатать массив после каждого добавления, вам нужно переместить его в цикл while.Нет никакой реальной причины для cout числа, которое вводит пользователь;они уже видят только что набранную строку.

Что еще более важно, существуют реальные проблемы с динамическим размещением.Вы создали статический массив (string * arrayOfWOrds = new string[1000];), затем передаете его функции, которая увеличивает размер нового массива на один элемент, устанавливает последний элемент в этом массиве на новое значение, а затем выполняет итерацию по всему новому массиву.и дублирует значения в старый массив.По сути, вы просто вставляете элементы в статический массив в этот момент, и то, что вы вставляете, - пустая куча (потому что в новом массиве есть только один элемент, и он находится в arrayLength + 1, что находится за пределами границ.исходного массива).

Вам нужно удалить старый массив, а не новый массив, который на самом деле должен быть брошен в кучу и возвращен.

По сути, он должен выглядеть примерно так:

#include <iostream>
#include <string>

using namespace std;

string* addToArray(string newWord, string myArray[], int& arrayLength)
{

  string * returnArray = new string[arrayLength + 1];
  returnArray[arrayLength] = newWord;

  for (int i = 0; i < arrayLength; ++i)
  {
    returnArray[i] = myArray[i];
  }
  arrayLength++;
  delete [] myArray;

  return returnArray;
}

int main()
{
  const int startSize = 0;
  string * arrayOfWords = new string[1];
  int arrayLength = startSize;
  string temp;

  cout << "Input: ";
  getline(cin, temp);

  string word = "";
  for (char c : temp){
    if (c == ' '){
      arrayOfWords = addToArray(word, arrayOfWords, arrayLength);
      word = "";
    } else word.push_back(c);
  }
  arrayOfWords = addToArray(word, arrayOfWords, arrayLength); // Don't forget the last word
  for (int i = 0; i < arrayLength; ++i)
  {
    cout << arrayOfWords[i] << endl;
  }
}
0 голосов
/ 22 февраля 2019

Это потому, что вы не возвращаете новый массив из функции addToArray.Внесенные вами изменения происходят только в addToArray, а не в main.

Вы также delete[] неверный массив, вы удаляете только что созданный массив.

Вы также копируете элементы массива в неправильном направлении, то есть из нового массива в старый.

Попробуйте, я переименовал некоторые переменные для ясности.В вашей функции нет временного массива, только новый массив и старый массив.Выбор хороших имен переменных очень важен для написания рабочего кода.Плохие имена переменных просто сбивают с толку.

string* addToArray(string newWord, string* oldArray, int& arrayLength)
{
  string * newArray = new string[arrayLength + 1];
  newArray[arrayLength] = newWord;

  for (int i = 0; i < arrayLength; ++i)
  {
    newArray[i] = oldArray[i];
  }

  arrayLength++;

  delete [] oldArray;
  return newArray;
}

Тогда используйте это так

arrayOfWOrds = addToArray(temp, arrayOfWOrds, arrayLength);
0 голосов
/ 22 февраля 2019
string in="dasd adas ads adsada adsa asd ads",out;
stringstream ss(in);
vector<string> vr;
while(ss>>out)
{
    vr.push_back(out);
    //cout<<out<<endl;
}
for(int i=0;i<vr.length();i++)
{
    cout<<vr[i]<<endl;
}

попробуйте сделать это

0 голосов
/ 22 февраля 2019

Массив не изменяется, поскольку вы передаете указатель в функцию addToArray, но он не может вернуть новый указатель обратно.Это можно исправить, изменив сигнатуру функции на

void addToArray(string newWord, string *myArray[], int& arrayLength)

Вам также необходимо соответствующим образом изменить код и устранить проблему с освобождением.

Вы можетеизбавьте себя от всех проблем и используйте std::vector вместо выделенного вручную динамического массива:

#include <iostream>
#include <string>
#include <vector>

using namespace std;

int main()
{
  vector<string> arrayOfWOrds;
  string temp;

  while (getline(cin, temp))
  {
    cout << temp << endl;
    arrayOfWOrds.push_back(temp);
  }

  cout << "Array" << endl;
  for (size_t i = 0; i < arrayOfWOrds.size(); ++i)
  {
    cout << arrayOfWOrds[i] << endl;
  }
}
...