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

问题描述 投票:-1回答:4

在输入上,我们得到一个我们读到的句子,直到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;
  }

}
c++ dynamic-memory-allocation
4个回答
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;
  }
}

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

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

试着这样做

© www.soinside.com 2019 - 2024. All rights reserved.