2012-05-04 10 views
0

J'ai quelques tableaux C de + que j'ai construit comme suit:Conversion de chaîne à charbon non-const *

std:array<const char *, 4) test1 = {abc.c_str(), def.c_str(), ghi.c_str()}; 

abc, def, ghi sont std::string

je dois passer ce tableau à une autre fonction qui a le prototype suivant: (int argc, char * argv[])

Comment dois-je modifier tableau afin que non-const char* ou moi qui peut être passé à abov e fonction. Ou devrais-je modifier la fonction à const char *. Je ne suis pas sûr si la fonction essaye de modifier char * quelque part puisque ce code de fonction n'est pas le mien et n'est pas disponible aussi bien actuellement.
Mais, en tout cas, il serait bon de demander comment je passerais non-const char * array à la fonction ci-dessus?

Répondre

1

Cela devrait fonctionner

abc.append(1, 0); // guarantee NUL termination 
def.append(1, 0); 
ghi.append(1, 0); 
std:array<char *, 4> test1 = {abc.data(), def.data(), ghi.data()}; 

ou

abc.append(1, 0); 
def.append(1, 0); 
ghi.append(1, 0); 
std:array<char *, 4> test1 = {&abc[0], &def[0], &ghi[0]}; 
+0

+ 'strdup()'/'free()' dans le cas où la fonction prototypée modifie les chaînes. –

+1

Si cela ne vous dérange pas de me demander, quel est le point de 'abc.c_str();' etc? Quels sont les effets secondaires? – chris

+0

@chris: Il s'assure que le contenu de la chaîne est suivi d'un octet NUL. –

2

S'il y a une possibilité que la fonction modifie la chaîne, vous devez redimensionner la chaîne à la taille maximale que la fonction peut utiliser alors redimensionnez-le à nouveau.

abc.resize(max); 
DoSomething(&abc[0]); 
abc.resize(strlen(&abc[0])); 

Si vous savez pertinemment que la fonction ne pas modifier la chaîne, le prototype de la fonction est de vous mentir. Vous pouvez vous allonger:

DoSomething(const_cast<char *>(abc.c_str())); 
+0

Prototypes de fonction Scumbag. C'est vraiment le seul usage justifié pour ce que je sais: réparer les erreurs des autres. Bon point avec le redimensionnement de la chaîne aussi. – chris

+0

une fonction de type main ne peut pas augmenter la longueur des chaînes passées en arguments, même si elle les modifie (elle pourrait, par exemple, utiliser 'strtok') –

+0

@BenVoigt, un style' main' La fonction ne recevrait pas 'string's elle recevrait' char * 's. Je suppose que si vous savez que la longueur de la chaîne ne va pas changer, vous pouvez vous passer de la paire de 'resize'. –