2010-01-12 4 views
3

Comment affecter une séquence de chaînes de caractères à une variable char ** argv dans un programme? C'est un argument de ligne de commande. J'essaie actuellement de convertir une application .exe en dll.Traiter avec char ** argv

Par exemple:

{ "string1", "string2", "string3"} ---> char ** argv variables

Mon problème est realted en quelque sorte à ceci: How does an array of pointers to pointers work? mais je peux Ne le faites pas travailler en utilisant l'extrait montré ici. Aidez-moi!

+0

Essayez-vous d'attribuer les trois arguments de ligne de commande à trois ombles séparés * variables dans votre programme, ou essayez-vous d'assigner trois variables dans un char ** vous vous êtes déclaré? –

+1

J'essaye d'assigner 3 chaînes au caractère ** que j'ai déclaré. Je pourrais également réaffecter une séquence différente de chaînes sur la dernière partie du programme. Quelle est la bonne façon de faire cela? – Rock

+0

Pourquoi sur Terre voudriez-vous modifier les paramètres passés? –

Répondre

8

const char* argv[] = {"string1", "string2", "string3", 0};

Si les arguments ne sont pas compilent des constantes de temps que je ferais quelque chose comme:

std::vector<const char*> arguments; 
arguments.push_back(somePointer); 
arguments.push_back(someOtherPointer); 
arguments.push_back(0); 
const char** argv = &arguments[0]; 

EDIT: En utilisant PaxDiablos informations qu'un argv -array devrait être nul terminé.

+1

@Andreas, si c'est un vrai argv (comme dans ce qui est attendu), il devrait avoir un quatrième pointeur sur NULL. Cela ne peut toutefois pas faire partie des exigences de cette situation. – paxdiablo

+0

C'est mieux, en supprimant le mien car il n'ajoute rien de nouveau maintenant (et parce qu'il utilise malloc - pouah!). – paxdiablo

+0

Je ne me souviens pas comment ils sont stockés en interne, mais dans cet exemple serait std :: vector être utilisable? –

0

Notez que la réponse d'Andreas Brincks est vraiment ce que vous voulez faire, où le vecteur effectue toutes les lourdes tâches d'allocation et fournit une sécurité exceptionnelle. Je suggère fortement que vous envisagiez de changer la raison pour laquelle vous ne pouvez pas utiliser le vecteur. Mais si vous ne pouvez vraiment pas vraiment le faire, je suppose que vous pourriez faire quelque chose le long des lignes du code ci-dessous:

int numArgs = YOUR_NUMBER_HERE; 

char **myArgv = new char*[numArgs+1]; 

for (int i=0; i<numArgs; ++i) { 
    myArgv[i] = new char[at least size of your argument + 1]; 
    strncpy(myArgv[i], whereever your string is, buffer size); 
    myArgv[buffer size] = '\0'; 
} 
myArgv[numArgs] = NULL; 


// use myArgv here 


// now you need to manually free the allocated memory 
for (int i=0; i<numArgs; ++i) { 
    delete [] myArgv[i]; 
} 
delete [] myArgv;