2012-01-20 50 views
6

Sono strutturata su una domanda molto semplice. Voglio creare dinamicamente una serie di stringhe in C++.creazione di array dinamici di stringhe C++

Come posso farlo?

Questo è il mio tentativo:

#include <iostream> 
#include <string> 
int main(){ 
    unsigned int wordsCollection = 6; 
    unsigned int length = 6; 

    std::string *collection = new std::string[wordsCollection]; 
    for(unsigned int i = 0; i < wordsCollection; ++i){ 
     std::cin>>wordsCollection[i]; 
    } 
    return 0;  
} 

Ma dando il seguente errore

error C2109: subscript requires array or pointer type 

Qual è l'errore?

E anche se ottengo il numero di input dell'utente, da std::cin posso creare un array di tale dimensione in modo statico?

+1

In futuro si prega di selezionare il blocco di codice e utilizzare il '{}' pulsante; questo renderà il tuo codice visualizzato correttamente nella domanda. –

+1

Hai digitato 'wordsCollection [i]' invece di 'collection [i]'. Non è possibile utilizzare una dimensione ottenuta * dinamicamente * (ad esempio tramite 'std :: cin') per creare una matrice statica. Inoltre, l'array perde perché non lo si rilascia mai. –

risposta

9

si intende digitare:

std::cin>>collection[i]; 

Ed è anche necessario per delete[]collection (o ti perdita di questa memoria).

Sarebbe un uso migliore std::vector<std::string> collection; e di evitare l'utilizzo del puntatore grezzo del tutto:

#include <iterator> 
#include <iostream> 
#include <string> 
#include <vector> 

int main() 
{ 
    const unsigned int wordsCollection = 6; 

    std::vector<std::string> collection; 
    std::string word; 
    for (unsigned int i = 0; i < wordsCollection; ++i) 
    { 
     std::cin >> word; 
     collection.push_back(word); 
    } 

    std::copy(collection.begin(), 
       collection.end(), 
       std::ostream_iterator<std::string>(std::cout, "\n")); 
} 
10

utilizzare std::vector<string> o std::list<string> con una rotazione a mano.

+2

Ma il vero problema è che 'wordsCollection' dovrebbe essere' collection'. – cnicutar

+0

Oh mio Dio, quanto sono sciocco ... Qualunque grazie ... puoi dirmi la risposta per la mia seconda domanda che posso creare un array statico di quello –

+1

Sono d'accordo, ma se scegli di andare avanti con 'nuovo std :: string' non dimenticare di 'delete [] collection' quando hai finito. È una buona idea assicurarsi che per ogni 'nuovo' si abbia un' delete' –

0

Penso che sia un errore di battitura semplice. std::cin>>wordsCollection[i] dovrebbe essere std::cin>>collection[i].

1

Penso che dovrebbe essere:

std::cin >> collection[i]; 
0

Stai ricevendo questo errore perché si sta cercando l'accesso agli elementi di un int (vale a dire wordsCollection), non un array di int (cioè collection). Che cosa si dovrebbe scrivere è

std::cin>>collection[i] 
0

Provare quanto segue:

#include <vector> 
#include <string> 
#include <iostream> 

int main(int argc, char* argv[]) 
{ 
    std::vector<std::string> myStrings; 
    myStrings.push_back(std::string("string1")); 
    myStrings.push_back(std::string("string2")); 

    std::vector<std::string>::iterator iter = myStrings.begin(); 
    std::vector<std::string>::iterator end = myStrings.end(); 
    while(iter != end) 
    { 
     std::cout << (*iter) << std::endl; 
     ++iter; 
    } 
    return 0; 
}