2012-01-20 6 views
6

Je suis structurer à une question très basique. Je veux créer dynamiquement un tableau de chaînes en C++.créer un tableau dynamique de chaîne C++

Comment puis-je faire cela?

C'est ma tentative:

#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;  
} 

Mais il donne l'erreur suivante

error C2109: subscript requires array or pointer type 

Quelle est l'erreur?

Et aussi si je reçois un nombre d'entrée de l'utilisateur, de std::cin puis-je créer un tableau de cette taille statiquement?

+1

Dans l'avenir s'il vous plaît sélectionnez votre bloc de code et utiliser le '{}' bouton; Cela fera apparaître votre code correctement dans la question. –

+1

Vous avez tapé 'wordsCollection [i]' au lieu de 'collection [i]'. Vous ne pouvez pas utiliser une taille obtenue * dynamiquement * (par exemple, 'std :: cin') pour créer un tableau statique. En outre, le tableau fuit puisque vous ne le relâchez jamais. –

Répondre

9

que vous vouliez dire taper:

std::cin>>collection[i]; 

Et vous devez également delete[]collection (ou vous allez leak cette mémoire).

Il est préférable d'utiliser std::vector<std::string> collection; et éviter l'utilisation du pointeur brut total:

#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

utilisez std::vector<string> ou std::list<string> en le roulant.

+2

Mais le vrai problème est que 'wordsCollection' devrait être' collection'. – cnicutar

+0

Oh mon dieu comme je suis bête ... Tout comment merci ... pouvez-vous me dire la réponse à ma deuxième question que je peux créer un tableau statique de cela –

+1

Je suis d'accord, mais si vous choisissez d'aller de l'avant avec de nouvelles std :: string' n'oubliez pas de 'delete [] collection' lorsque vous avez terminé. C'est une bonne idée de s'assurer que pour chaque 'new' vous avez un' delete' –

0

Je pense que c'est une simple faute de frappe. std::cin>>wordsCollection[i] doit être std::cin>>collection[i].

1

Je pense que cela devrait être:

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

Vous obtenez cette erreur parce que vous essayez accéder aux éléments d'un int (à savoir wordsCollection), pas un tableau de int (à savoir collection). Ce que vous devriez écrire est

std::cin>>collection[i] 
0

Effectuez les opérations suivantes:

#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; 
}