在输入上,我们得到一个我们读到的句子,直到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;
}
}
我在这看到几个问题。首先,你设置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;
}
}
这是因为你没有从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);
数组未更改,因为您将指针传递给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;
}
}
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;
}
试着这样做