bonjour je suis en train de creer un deux programes qui sont censées communiquer via les parametres de la fonction main, et j'ai un probleme:
dans le second programe je compare un argument avec une chaine de charactère, comme je le fais habituelement, mais cette fois, bien qu'il n'y ait pas de différence entre la chaine de charactère et le parametre, mon programe ne m'affiche pas ce qu'il est censé afficher. je vois pourtant que le programme s'execute car j'ai rajouté des ligne qui sont censé afficher e paramètre argv[1] et il est afficher.
cela fais trois jour que je teste des changements et que je cherche un résolution pour ce probleme donc je vien voir si la communauté pourrais m'aider.
Héhé... à, tu ne compare pas deux chaines ds caractères, comme tu le crois, mais bien deux ... pointeurs de types char, qui représentent donc l'adresse du premier caractère de la chaine.
Or, comme arv[1] (qui représente donc l'adresse à laquelle se trouve le deuxième argument de ton programme, le premier étant son nom est donné par l'utilisateur.
D'un autre coté, "fullscreen" et "window" étant des chaines de caractères littérales, elles sont connues et clairement établies à la compilation et vont donc se retrouver dans une zone bien précise de ton exécutable final.
Il n'y a donc absolument aucune chance pour que les adresses mémoires (qui ne sont que des valeurs numériques entières généralement non signées) correspondent.
Tu ne dois donc pas comparer les deux pointeurs comme tu le fais, mais bien comparer ... la donnée qui commence à l'adresse représentée par ces deux pointeurs.
Ceci étant dit, la représentation d'une chaine de caractères sous la forme d'un pointeur sur un caractère (typiquement un char * ) et la représentation classique des chaines en C, qui est avantageusement gérée par la classe std::string.
Si tu n'as pas trop de paramètres susceptibles d'arriver dans ta lignes de commande, tu peux toujours les convertir en chaines de caractères sous la forme de
std::string mode{argv[1]};
/* puis la comparaison */
if(mode =="fullscrean")
/* ... */
else if (mode =="window")
/* ... */
Si tu en as un peu plus, tu serais peut-être bien inspiré de travailler avec un std::vector et des std::string_viewsous une forme qui ressemblerait alors à quelque chose comme
/* la récupération */
std::vector<std::string_view>> params;
for(size_t i=1;i<arvc;++i){ // je ne prend pas le premier paramètre
// qui est le nom du programme et
// ne m'intéresse pas
params.push_back(std::string_view{argv[1]});
}
/* plus loin tu pourras les utiliser sous une forme proche de
*/
/*cherchons si un des paramètres correspond */
for(auto & it : params){
if(it == "salut")
std::cout<<"trouvé salut";
}
Et, dans le pire des cas (de nombreux paramètres à gérer), peut-être devrais tu envisager de te tourner vers boost::program_options.
Ce qui se conçoit bien s'énonce clairement. Et les mots pour le dire viennent aisément.Mon nouveau livre : Coder efficacement - Bonnes pratiques et erreurs à éviter (en C++)Avant de faire ce que tu ne pourras défaire, penses à tout ce que tu ne pourras plus faire une fois que tu l'auras fait
Comme la comparaison de 2 pointeurs sur des char n'est pas la comparaison des chaines, on peut utiliser le fait qu'une std::string_view est quant à elle comparable à un pointeur sur des char
#include <iostream>
#include <string_view>
int main( int argc, char *argv[] ) {
if ( argc < 2 ) {
endl( std::cerr << "ERROR : use a parameter : -p <PARAMETER>");
return -1;
}
using namespace std::literals; // là on peut avantageusement utiliser using namespace
if ( argv[1] == "fullscreen"sv )
endl( std::cout << "mode : " << argv[1] );
else if ( argv[1] == "window"sv )
endl( std::cout << "mode : " << argv[1] );
}
En recherche d'emploi.
problème paramètre fonction main
× Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
× Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
En recherche d'emploi.