2012-11-01 35 views
5

Bir ev ödevi üzerinde sıkışmış durumdayım. Bir dosyadan metni okumalı, her kelimeyi belleğe ayırmalıyım, ardından bir işaretçiyi bir vector<string*> adresine göndermek için kullanmalıyım. Programım, yeni kelimeyle vektörün üzerine yazmanın yerine yeni kelimeyle yazılmasına devam ediyor. Bunun neden olduğunu anlayamıyorum.C++ işaretçi ile işaretçi

#include <iostream> 
#include <fstream> 
#include <vector> 
#include <string> 
using namespace std; 


void WordFunctions(string *pstr, vector<string*> &words) 
{ 
    words.push_back(pstr); 
} 
int main(){ 
    ifstream file; 
    vector<string*> a; 
    string word; 
    int w =0; 
    file.open("word.txt"); 
    while (!file.eof()) 
    { 
     w++; 
     file >> word; 

     WordFunctions(&word, a); 
    } 
    file.close(); 

    for (int i=0;i<10;i++){ 
     cout<<(*a[i])<<" "; 
     delete a[i]; 
    } 

    system ("pause"); 
} 
+1

Geez yeni başvuru geçmesi, döngü içinde yeni dizeleri için bellek ayırması gerekir .. ödeviniz aslında sizi bir işaretçi vektörünü kullanmaya zorlar ve bunun neden korkunç bir fikir olduğunu açıklamıyor mu? Sadece bildiğiniz gibi, vektörünüzdeki her bir elementi elden çıkarma sorumluluğunuz var, bu da size verilen büyük bir faydayı reddediyor. * Bazen * vektörlere (genellikle değil!) işaretçileri kaydetmeniz gerekir ve bu durumda akıllı bir işaretçi, yani 'unique_ptr' veya benzer bir şey kullanırsınız. Onu bir daha gördüğünüzde öğretmeninize söyleyin. –

cevap

3

bir vector<string> kullanabilir veya yığın yeni dize tahsis Ya:

void WordFunctions(string *pstr, vector<string*> &words) 
{ 
    words.push_back(new string(*pstr)); 
} 
+0

Şüphesiz, değeri işaretçi yerine const ref ile iletmek daha iyidir? sonra hiçbir kötü dereferencing vb ... – Caribou

+0

@Caribou Evet, öyle. Ama en az değişiklikle gitmek istedim. Aksi halde, arama yapan siteyi de değiştirmeniz gerekir. –

+0

true - burada sadece cringing;) – Caribou

1

Kelimenin adresidir vektörü içine aynı eleman bastırıyorlar. Ben senin kod üzerinde biraz masaj

// pass reference to eliminate copy 
void WordFunctions(string &str, vector<string> &words) 
{ 
    words.push_back(str); 
} 
int main(){ 
    ifstream file; 
    vector<string> a; // you want to store string not the address of the string 
    string word; 
    int w =0; 
    file.open("words.txt"); 
    while (!file.eof()) 
    { 
     w++; 
     word.clear(); // clear the content before store something into it 
     file >> word; 
     WordFunctions(word, a); 
    } 
    file.close(); 

    for (size_t i=0;i<a.size();i++){ // use size instead of hard code magic number 
     cout<<(a.at(i))<<" "; // use at function instead of [] 
    } 

    system ("pause"); 
} 
-1

döngü içinde size dizesinin değerini değişiyor, ama sonra hep ona aynı adresi geçirerek WordFunctions çağrı böylece word dize, hep hafızada aynı adresi vardır . yerine vector<string> ait vector<string*> kullanmak için bir kısıt ise

, büyük olasılıkla sözünü orada kopyalayıp sonra WordFunctions

char *wordPtr 

while (!file.eof()) 
{ 
    w++; 
    file >> word; 

    wordPtr = (char *)malloc((strlen(word)+1)*sizeof(char)); 
    strcpy(wordPtr, *word); 

    WordFunctions(wordPtr, a); 
} 
+1

Tamamen çalıştığından emin değilim, ama fikir bu olmalı. – unziberla

+1

Hey, bu adam C++ kullanmaya çalışıyor. Neden malloc kullanmayı öneriyorsunuz? – Ruu

+1

Haklısınız! Bu şekilde çözdüğüm C'deki klasik ödevlere çok benziyordu! Şimdi doğru çözümü gördünüz ve yedekledik – unziberla