2014-05-14 7 views
-1

Je veux prendre argv [(2 dans cet exemple)], le stocker en vecteur et l'utiliser plus tard dans le programme. Le problème est qu'aucun opérande ne correspond à ces opérandes std :: string == int. Cela signifie-t-il que l'application voit '-r' comme int? Je suis un peu confus ici.C++ using arguments ARGV

int main(int argc, char* argv[]) 
{ 
    std::vector<std::string> argList; 
    cout<<"argc: "<<argc<<endl; 
    for(int i=2; i<=argc; i++) 
    { 
     argList.push_back(argv[i]); 
    } 
    if(argList.at(2) == '-r') cout<<" Good job "; 
} 
+6

Vous avez juste besoin des guillemets doubles pour faire une chaîne littérale: ' « -r »' . Avec des guillemets simples, c'est un littéral de type int. –

+0

argv [2] est placé dans argList [0] et argList [2] contient argv [4] donc passez-vous 4 paramètres à votre programme? Vraiment, vous devriez vérifier la taille du vecteur avant d'essayer d'accéder à l'élément 2 –

+0

Aussi une copie de/répondu par http://stackoverflow.com/questions/3683602/single-quotes-vs-double-quotes-in-c –

Répondre

1

Il y a plusieurs problèmes avec votre programme:

  1. Vous itérer i jusqu'à i == argc, qui va tenter de construire une chaîne de argv[argc], un pointeur NULL en raison de l'exigence par rapport aux normes C et C++ que argv[argc] soit 0 (NULL), voir this SO question. argv est un tableau avec argc pointeurs vers null-terminated character strings (terminé par ASCII NUL, 0), le tableau lui-même est terminé avec un pointeur NULL (non compté dans argc). Maintenant, en C++, vous pouvez construire une chaîne à partir d'un pointeur vers une chaîne de caractères terminée par un caractère nul, mais en passant un pointeur NULL à un constructeur de chaîne entraîne un comportement indéfini, see this SO question, voir aussi la liste des constructeurs std :: string here, vous êtes implicitement en utilisant le constructeur (4) dans cette liste (à partir de c-string).
  2. Vous commencez à pousser sur argList avec i==2, ce qui signifie que argList [0] contiendra argv[2], vous faites référence alors argList.at(2), qui correspondrait à argv[4], il est peu probable que vous vouliez dire.
  3. cordes littéraux utilisent des guillemets doubles

J'ai corrigé ces derniers et a créé un programme de travail, cliquez sur here

#include <iostream> 
#include <vector> 
#include <string> 
using std::vector; 
using std::string; 
using std::cout; 
using std::endl; 

int main(int argc, char* argv[]) 
{ 
    vector<string> argList; 
    cout << "argc: " << argc << endl; 
    for(int i=0; i < argc; ++i) 
    { 
     argList.push_back(argv[i]); 
    } 
    cout << "Program name is " << argList[0] << endl; 
    if(argc > 1) { 
     if(argList.at(1) == "-r") { 
      cout << " Good job, you supplied -r\n"; 
     } else { 
      cout << "Unrecognized option " << argList[1] 
       << "\nUsage: " << argList[0] << " -r\n"; 
     } 
    } 
    return 0; 
} 
+0

"Donc argv [argc] == NULL" - Non, pas du tout. 'argv [argc]' invoque un comportement non défini et vous ne pouvez pas faire d'hypothèses quant à ce que contient le prochain bit de mémoire. –

+1

Section 3.6.1 de C++ Standard (brouillon) http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2012/n3337.pdf indique "La valeur de argv [argc] doit être 0 " – amdn

+1

La section '5.1.2.2.1 Lancement du programme' de C Standard (projet) http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1124.pdf indique que" argv [argc] doit être un pointeur nul. " – amdn

0

Le problème est l'utilisation de guillemets simples dans '-r'. Vous voulez des guillemets doubles ici:

if(argList.at(2) == "-r") cout<<" Good job "; 

La raison en est que, en C++, des guillemets simples sont utilisés pour caractères seulement. Il existe une "constante de caractères multi-octets", qui est ce que '-r' finit par être. C'est quelque chose de complètement différent d'une constante de chaîne, ce que vous voulez.