2009-03-06 6 views
2

J'utilise getopt_long pour traiter les arguments de ligne de commande dans une application C++. Les exemples montrent tous quelque chose comme printf("Username: %s\n", optarg) dans les exemples de traitement. C'est très bien pour montrer un exemple, mais je veux pouvoir stocker les valeurs pour les utiliser plus tard. La plupart du reste du code utilise string objets au lieu de char* donc j'ai besoin de lancer/copier/tout ce que le contenu d'optarg dans une chaîne.Obtenir optarg en tant qu'objet chaîne C++

string bar; 
while(1) { 
    c = getopt_long (argc, argv, "s:U:", long_options, &option_index); 
    if (c == -1) break; 
    switch(c) 
     { 
      case 'U': 
       // What do I need to do here to get 
       // the value of optarg into the string 
       // object bar? 
       bar.assign(optarg); 
       break; 
     } 
} 

Le code ci-dessus compile, mais quand il exécute je reçois une erreur Illegal instruction si je tente d'imprimer la valeur de la barre à l'aide printf (il semble fonctionner très bien pour Cout). Je ne connais pas assez le débogage de la ligne de commande pour mieux comprendre ce que pourrait être l'instruction illégale. J'avais couru valgrind, mais le volume pur des erreurs de mémoire qui résultent de cette erreur ont rendu difficile pour moi de localiser exactement ce qui pourrait causer cette erreur.

Répondre

7

Vous avez indiqué à printf que vous fournissiez une chaîne de style c (tableau de caractères terminé par un caractère nul) lors de la spécification de% s, mais que vous avez fourni une classe de chaînes à la place. En supposant que vous utilisez std :: string essayer:

printf("bar : %s\n", bar.c_str()); 
6

printf() ne peut pas gérer string C++ s. Utilisez bar.c_str() à la place.

+0

Je suppose que je devrais mettre ceci dans ma liste de choses importantes à se rappeler. Merci! –

3
cout << " bar: " << bar << "\n"; 

est parfaitement sûr. Qu'est-ce qui vous fait penser que ce ne serait peut-être pas?

+0

Seulement parce que je me rends compte que parfois, juste parce qu'il fonctionne, cela ne veut pas dire que c'est sûr. :) Surtout s'il semble qu'une autre méthode meurt en utilisant le même objet. –

Questions connexes