动态分配的数组C ++读取句子并打印单词

时间:2019-02-22 06:58:29

标签: c++ dynamic-memory-allocation

在输入中,我们得到一个句子,一直读到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 :(得分:1)

这是因为您没有从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);

答案 1 :(得分:0)

该数组未更改,因为您将指针传递给了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;
  }
}

答案 2 :(得分:0)

我在这里看到了几个问题。首先,您设置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;
  }
}

答案 3 :(得分:-2)

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;
}

尝试这样做