在输入中,我们得到一个句子,一直读到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;
}
}
答案 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;
}
尝试这样做