2010-07-08 4 views
2

Nous avons:Quel est le moyen le plus efficace de convertir le tableau de chaînes STL en const char * array?

std::string string_array[2]; 

string_array[0] = "some data"; 

string_array[1] = "some more data"; 

char* cstring_array[2]; 

Quel est le moyen le plus efficace pour copier les données de string_array à cstring_array? Ou passez string_array à la fonction, nécessaire "const char* cstring_array[]"?

+7

Les index sont basés sur 0 en C++. Donc vous voulez dire 'string_array [0]' et 'string_array [1]' –

+0

Oui, bien sûr, merci – hoxnox

+0

Comment la fonction utilise-t-elle const char * cstring_array []? –

Répondre

12

Une fonction qui prend un char const * est uniquement écrite pour accepter une seule chaîne à la fois, pas un tableau de chaînes. Pour passer un std::string à une telle fonction, il suffit d'appeler la fonction avec your_string.c_str() comme paramètre.

Edit: pour une fonction qui prend un tableau de chaînes, le choix évident (au moins pour moi) serait d'écrire un minimum frontal qui vous permet de passer un vector<std::string>:

// The pre-existing function we want to call. 
void func(char const *strings[], size_t num) { 
    for (size_t i=0;i<num; i++) 
     std::cout << strings[i] << "\n"; 
} 

// our overload that takes a vector<string>: 
void func(std::vector<std::string> const &strings) { 
    std::vector<char const *> proxies(strings.size()); 

    for (int i=0; i<proxies.size(); i++) 
     proxies[i] = strings[i].c_str(); 
    func(&proxies[0], proxies.size()); 
} 
+0

Désolé, j'ai fait une erreur. La fonction a besoin de const char * array []. ARRAY de const char * cordes. – hoxnox

+0

Génial !!! Merci!!! – hoxnox

3

utiliser simplement:
string_array[0].c_str()
string_array[1].c_str()

Voir c_str():

const charT * c_str() const basic_string Renvoie un pointeur à un tableau zéro terminal de caractères représentant la contenu de la chaîne .

+0

Désolé, j'ai fait une erreur. La fonction a besoin de const char * array []. ARRAY de const char * cordes. – hoxnox

4

Utilisez string::c_str pour obtenir un pointeur constant vers un caractère.

+0

Désolé, j'ai fait une erreur. La fonction a besoin de const char * array []. ARRAY de const char * cordes. – hoxnox

1

Vous pouvez accéder à une version de chaîne de caractères en passant string_array [1] .c_str() à n'importe quelle fonction nécessite la chaîne. Notez toutefois que le pointeur renvoyé dépend de la chaîne stl :: string! Si vous prenez le pointeur, puis libérez la chaîne, vous aurez un pointeur invalide

+0

Ou même si vous modifiez la chaîne sans la libérer. Le tampon pourrait être désaffecté et remplacé par un plus grand. –

+0

Désolé, j'ai fait une erreur. La fonction a besoin de const char * array []. ARRAY de const char * cordes. – hoxnox

0

Deux questions différentes, vraiment. Pour passer à une fonction, appelez simplement c_str(). Pour copier, il suffit d'appeler strncpy() et rappelez-vous ce que j'ai dit à propos de passer aux fonctions. Gardez à l'esprit que std :: string peut contenir '\ 0' sans se terminer. Dans de telles conditions, vous n'obtiendrez qu'une partie de la chaîne. Si vous essayez de copier ces données, vous devrez utiliser memcpy() à la place.

+0

Désolé, j'ai fait une erreur. La fonction a besoin de const char * array []. ARRAY de const char * cordes. – hoxnox

+0

Ensuite, vous devrez les copier, individuellement, dans le tableau. Il n'y a aucun ensemble de fonctions qui pourraient temporairement jeter l'un dans l'autre. –

+0

Peut-être qu'il existe un moyen d'accéder à la mémoire, allouée en chaîne STL? Et un peu de "magie" fait que cette mémoire ressemble à const char * array? Je suis un deramer =)) – hoxnox

0

Il semble que vous ayez des problèmes avec les tableaux. Comme Brian a souligné, les indices de tableau commencent à 0 et non 1. Ainsi, vos deux strings sont string_array[0] et string_array[1], passtring_array[1] et string_array[2].

En outre, si votre fonction prend un paramètre const char* cstring_array, alors votre variable char* cstring_array[2] n'est probablement pas ce que vous voulez. Si vous deviez le transmettre tel quel, vous passeriez essentiellement dans un char**, pas un char*, car vous pouvez considérer que le nom d'un tableau est équivalent à un pointeur sur son premier élément.

Comme vous l'avez présenté votre question, vous pourrait faire quelque chose comme ce qui suit (correction de l'erreur d'indexation, et en supposant que la fonction dont vous parlez est appelé myFunction):

... 
cstring_array[0] = string_array[0].c_str(); 
cstring_array[1] = string_array[1].c_str(); 

myFunction (cstring_array[0]); 
myFunction (cstring_array[1]); 
... 

Cependant, une simple équivalent qui ne nécessite pas du tout cstring_array est:

... 
myFunction (string_array[0].c_str()); 
myFunction (string_array[1].c_str()); 
... 

Ou, si votre intention était de passer un seul tableau contenant char bot cordes h (ce qui est une possibilité de mon interprétation de la question), alors ce que vous entendez vraiment que vous voulez faire est que vous voulez produire une seule chaîne étant la concaténation de vos deux d'origine:

... 
std::string str = string_array[0] + string_array[1]; 

myFunction (str.c_str()); 
... 

Espoir qui aide !

EDIT: étant donné les commentaires qui sont apparus depuis que j'ai écrit ceci, je dirais que le premier exemple est proche de ce dont vous avez besoin. Je ferais ce qui suit (où N est le nombre d'entrées dans l'un ou l'autre tableau):

... 
for (int i = 0; i < N; i++) 
    cstring_array[i] = string_array[i].c_str(); 

myFunction (cstring_array); 
... 

C'est la seule approche possible. Il n'y a pas de fonction standard (AFAIK) qui, étant donné un tableau de string donnera un tableau de char*. Je suppose que les raisons sont les suivantes: - Ce n'est pas quelque chose qui doit être fait souvent, donc il y a peu d'appels pour qu'une telle fonction soit largement disponible. - S'il y avait une telle fonction, elle serait probablement très similaire à celle ci-dessus, auquel cas c'est tellement trivial que cela soit inutile. Fondamentalement, pour répondre à votre question, je ne pense pas qu'il existe une méthode plus efficace, et même s'il y avait une fonction de bibliothèque standard pour ce faire, elle utiliserait quand même cette approche.

+0

> pour (int i = 0; i cstring_array [i] = string_array [i] .c_str(); Mais, dans ce cas, je dois allouer de la mémoire à cstring_array. Peut-être qu'il y a un meilleur moyen? Accéder à la mémoire allouée par le tableau de chaînes STL, ou smth ...? – hoxnox

Questions connexes