2013-09-27 2 views
-1

Je développe un programme de ligne de commande en utilisant unordered_map et char * en C++.C++ carte non ordonnée pour stocker les paramètres de ligne de commande

Cependant, cela ne fonctionne pas.

Voici mon code.

#include "stdafx.h" 
#include <unordered_map> 

int main(int argc, char *argv[]) 
{ 
    std::unordered_map <char*, char*> hash; 

    for (int i = 1; i<argc; i++){ 
    if (argv[i][0] == '-'){ 
    hash[argv[i]] = argv[i+1]; 
    } 
} 

if (hash["-file"]){ 
    printf("Openning the file %s \n", hash["-file"]); 
}else{  
    printf("Error open files \n"); 
    return 0; 
} 

}

Quand je fournis à mes listes de Arguement:

myprogram.exe -file "c:\myfile.txt" -option1 ..... 

Il ne peut pas ouvrir le fichier d'entrée.

Quelqu'un peut-il m'aider avec?

Merci beaucoup

+4

Je vais juste vous dire maintenant le 'char *' que vous transmettez comme votre clé * lookup * est * pas * la même adresse réelle résidant en tant que clé dans votre carte utilisée comme clé * insertion *. L'un vient de 'argv []', l'autre un littéral en lecture seule. Dans * la plupart * des cas, les pointeurs ne sont pas ** ** ce que vous voulez pour les clés. (il y a des situations où c'est utile, mais ce n'est pas l'un d'eux, évidemment). John l'a brièvement mentionné ici, et cela pourrait être une réponse. utilisez 'std :: string' comme type de clé pour votre carte. – WhozCraig

Répondre

1

Comme @WhozCraig dit dans un commentaire, vous devez utiliser std::string au lieu de char* comme le type de clé dans votre carte. Vous pouvez continuer à utiliser char * comme type de valeur, puisque argv a la durée de vie du programme entier. Cependant, si vous pouvez utiliser Boost, leur bibliothèque d'options de programme est meilleure que n'importe laquelle de ces choses écrites à la main. Malheureusement, puisque vous semblez utiliser Windows, votre plate-forme ne fournit aucun élément intégré comme getopt_long(), mais Boost PO est la meilleure solution pour cela en C++.

Questions connexes