Vérification argv[] contre une chaîne de caractères? (C++)
Donc, je suis d'essayer de vérifier les arguments que je suis en entrant dans mon programme, et l'un d'eux est le mot "oui" ou "non", entré sans les guillemets.
Je suis en train de tester l'équivalence ( if (argv[n] == "oui") ), mais qui semble être de retour faux à chaque fois lorsque l'entrée est, en fait, oui(Quand je l'ai sortie il le confirme). Ce qui me manque ici que je fais mal?
Si je comprends correctement argv[n] renvoie une cstring qui est nul, de sorte qu'il devrait me permettre de faire cela.
- double possible de Aide à comparer une string argv
Vous devez vous connecter pour publier un commentaire.
Vous êtes à la comparaison de pointeurs. Utiliser strcmp, ou std::string.
std::find
au lieu de la boucle sur levector
?Voici une meilleure alternative à std::string, et lorsque l'efficacité est importante - en C++17 vous avez maintenant la très utile std::string_view. Cela vous permet de travailler avec les arguments de la même façon à un std::string, sans encourir le coût de la copie.
Actuellement disponibles dans std::expérimental dans GCC:
strcmp est égale à zéro si les 2 chaînes sont les mêmes.
Vous pouvez également prendre un coup d'oeil dans boost::program_options, même si cela semble un peu hors sujet et exagéré, mais une fois que vous vous habituez à elle c'est facile, pratique et sûr à utiliser. Certains avantages sont générés automatiquement --help pour votre programme, ainsi que des choses comme
évaluation de la chaîne peut être fait en sécurité en utilisant lexical_cast.
C++ moderne, avec un peu de
const
de l'exactitude...Remarque: La norme ne garantit pas que vous pouvez utiliser
const
dans la signature demain
, ni n'interdisent.Comme utilisé ici,
const
assure que nous ne sommes pas de changer les choses nous n'avons pas l'intention de changer -- ce qui est le but deconst
dans le langage C++.Voir aussi...
const char *optstring) -- avis de la signature
argc
auto
exigence de gamme pour à la fin, alors? Beurk 🙁argc+1
inutile allocations dynamiques etargc
totalement inutile chaîne de copies. De faire au moins un vecteur de la chaîne de points de vue...int main( int argc, char * const argv[] )
est non portable. (Les liens que vous proposez ne couvrent pas ce type d'utilisation)argc == 0
std::string_view
. Cependant, j'avais déjà mis en place mon propre parce que, eh bien, c'est un outil incontournable à avoir ;pstring_view
prévoit une baisse-dans le remplacement pourstring
dans mon exemple, mais il semble ne pas être encore largement pris en charge. Il a travaillé sur Ubuntu 16.04 avec g++5, clang-4, et clang-5 -- mais j'ai dû utiliser<experimental/string_view>
etstd::experimental::string_view
. À un certain moment dans l'avenir, ce sera une belle optimisation pour les cas comme celui-ci.+1
dansargv+1
est, en principe, un système spécifique. Je ne pense pas qu'il existe un moyen simple de faire le travail de façon portable, conformément à la norme. C'est ma compréhension, toutefois, que l'utilisation de+1
va toujours être la bonne chose à faire: stackoverflow.com/a/3024202argc == 0
première ... (et portable pour utiliser la signature pour les principaux)[0]
argument.string_view
a déjà été posté. stackoverflow.com/a/42864876/86967auto
est nécessaire en C++17. J'ai appris beaucoup de choses aujourd'hui. auto un mot-clé facultatif dans variait en fonction de boucle?