2009-11-24 12 views
0

Dans ma classe de programmation, nous avons actuellement un projet qui nécessite que nous prenions des arguments dans le programme. Je dois ensuite être en mesure de vérifier l'un des arguments pour voir quelle valeur a été transmise au programme afin que je puisse choisir le comportement approprié pour le programme à suivre. Dans une tâche de travail précédente Je l'ai fait avec la fonction strcmp inclus dans la bibliothèque de cstring en utilisant le code suivant:Comparaison de tableaux de caractères et de littéraux de chaînes en C++ sans cstring

int main(int argc, char *argv[]) { 
    if (strcmp(argv[1], "yes") == 0) { 
     // do this code 
    } else if (strcmp(argv[1], "no") == 0) { 
     // do this code 
    } 
} 

Cependant, pour une raison quelconque, nous ne sommes pas autorisés à utiliser la bibliothèque cstring dans ce projet. Comment puis-je faire cela?

+1

Pour 2-3 caractères, vous pouvez même essayer if (str [0] == 'n' && str [1] == 'o'). (peut-être && str [2] == '\ 0') –

+4

Le but de l'affectation semble être de vous apprendre à écrire 'strcmp'. YMMV! – dirkgently

+1

Non, nous sommes en train d'écrire une implémentation de blackjack. C'est juste un problème mineur que j'ai rencontré que je ne savais pas comment aborder. – blcArmadillo

Répondre

5

Essayez ceci:

if (argv[1] == std::string("yes")) { stuff }

Si le but de l'exercice est d'apprendre comment fonctionnent les comparaisons de chaînes, puis mettre en œuvre une boucle comme d'autres réponses suggèrent. Cependant, en C++ vous n'êtes pas censé utiliser strcmp - il y a une classe de chaînes pour une raison.

+0

S'il ne peut pas utiliser 'cstring', je doute qu'il puisse utiliser la classe' std :: string' –

+2

Eh bien, cela dépend du cours. Je connais des cours C++ où l'utilisation de fonctions C est interdite pour forcer les gens à apprendre les fonctionnalités C++ offrant la même fonctionnalité. J'ai édité ma réponse pour mieux refléter cela. – hrnt

+0

Je vois; bon appel. –

1

Vous pouvez toujours comparer les chaînes à l'aide d'un manuel pour la boucle, en les comparant caractère par caractère. Votre condition de terminaison sera lorsque vous rencontrerez un caractère NULL (puisque dans les chaînes C sont à terminaison nulle) ou lorsque vous rencontrerez un caractère dans la première chaîne qui n'est pas égal à son homologue dans la deuxième chaîne.

const char* s1 = "abcdefg"; 
const char* s2 = "abcdefg"; 

const char* p1 = s1; 
const char* p2 = s2; 

int same = 0; 
for (; (same = (*p1 == *p2)) && *p1 != '\0'; ++p1, ++p2); 

if (same) printf("The strings are equal\n"); 
else printf("The strings are NOT equal\n"); 

Cela vous donnera une comparaison de caractère par caractère. Mais notez que ceci est différent de strcmp dans le sens où strcmp fait une comparaison lexicographique qui vous dira également si une chaîne est "moins" qu'une autre chaîne en termes d'ordre alphabétique. Mais il semble que vous ayez seulement besoin d'une comparaison d'égalité, qui vous dira seulement si les chaînes sont identiques ou non.

+0

Cela n'échouerait-il pas pour s1 = "a" et s2 = "abcdefg"? Autrement dit, ne dirait-il pas que les chaînes étaient égales? – ChrisInEdmonton

+0

Bon point, la vérification de nullchar devrait se produire après la comparaison. Je vais corriger le code ci-dessus. –

1

écrire votre propre fonction strcmp

+1

OUI! - mais appelez-le autrement pour que votre TA ne vous marque pas parce qu'ils ont vu 'strcmp()' dans votre solution. –

2

Faites votre propre fonction my_string_comp:

// return 0 on success, -1 on failure 
int my_string_comp(char* a, char *b) { 
    if(a && b) { // check for non null pointers 
    while(*a != '\0' && *b != '\0' && *a == *b) { a++; b++; } 
    if(*a == '\0' && *b == '\0') { return 0; } 
    } 
    return -1; 
} 

Notez que cette fonction donne une sortie booléennes alors que strcmp renvoie des valeurs correspondant à l'ordre lexicographique de deux chaînes d'entrée.

+0

À noter que strcmp() renvoie plus de granularité que cela, c'est-à-dire qu'il peut renvoyer 0, -1 ou 1. – asveikau

+0

True. C'est une fonction simplifiée pour générer une sortie booléenne. –

0

Vous pouvez hacher la chaîne d'entrée et basculer en fonction de sa valeur numérique - pour les valeurs de cas, utilisez les valeurs hachées des constantes symboliques. Vous pouvez créer un script externe pour générer un fichier d'en-tête avec le mappage "chaîne" vers "hachage".

0

Je recommande vivement Boost.Program options pour le traitement des arguments en ligne de commande C++. Cela peut être exagéré pour quelque chose comme ça, mais pour quelque chose d'encore plus compliqué, la bibliothèque d'options Boost.Program est moins de code, plus facile à comprendre une fois écrite, et vous permet de prendre des arguments de fichiers de configuration ou de variables d'environnement ou passer sur la ligne de commande, avec presque pas de travail.

Quelque chose à peu près comme suit (non testé) devrait fonctionner pour vous:

namespace po = boost::program_options; 

int main() { 
    po::options_description desc("Allowed options"); 
    desc.add_options() 
    ("help", "produce help message") 
    ("yes", "get down") 
    ("no", "get funky") 
    ; 

    po:variables_map vm; 
    po::store(po::parse_command_line(argc, argv, desc), vm); 
    po::notify(vm); 

    if (vm.count("yes")) { 
    // get down 
    } else if (vm.count("no")) { 
    // get funky 
    } 
} 

La page tutoriel donne un certain nombre d'autres exemples qui montre qu'il est presque pas de travail à ajouter d'autres, beaucoup plus complexe, commande arguments en ligne

Notez que boost n'est pas inclus par défaut en C++, mais il n'est normalement pas trop difficile de l'ajouter.Boost est l'un de ces ensembles de bibliothèques que tous les programmeurs C++ doivent connaître. S'il vous plaît être averti que cela peut être exagéré si vous apprenez toujours C++, cependant.