IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

 C++ Discussion :

strcomp() error C2664: 'strcmp'


Sujet :

C++

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    84
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2008
    Messages : 84
    Par défaut strcomp() error C2664: 'strcmp'
    Error 1 error C2664: 'strcmp' : cannot convert parameter 1 from 'std::string' to 'const char *'

    Scenario: La personne est amené à répondre oui/non à une question, je place cela dans sRap qui est un object string, ensuite je fais un test qui foire...

    Je viens du java, je veux tout simplement comparer deux chaines de carateres:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    cout << "Voulez-vous le service rapide?[oui/non]:\n";
    		cin >> sRap;
     
    		bool valide = false;
    	 while(valide == false){
    		if( strcmp(sRap,'oui') ==0 || strcmp(sRap,"o") ==0){ //Bug ici...
    			sRap = "oui";
    			valide = true;
    		}
    		else if( sRap == "non" || sRap == "n"){
    			sRap = "non";
    			valide = true;
    		}else{
    			cout << "Voulez-vous le service rapide?[oui/non]:\n";
    			cin >> sRap;
    	 }

  2. #2
    Sub
    Sub est déconnecté
    Membre averti
    Profil pro
    Inscrit en
    Mars 2003
    Messages
    20
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Mars 2003
    Messages : 20
    Par défaut
    strcmp prends un char* et tu lui passe un std::string. Remplace sRap par sRap.c_str() dans la fonction strcmp.

  3. #3
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Par défaut
    Salut,
    std::string possède un opérateur == et une fonction interne compare :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if(( sRap=="oui") || (sRap.compare("o")==0)){

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    84
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2008
    Messages : 84
    Par défaut
    Citation Envoyé par 3DArchi Voir le message
    Salut,
    std::string possède un opérateur == et une fonction interne compare :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if(( sRap=="oui") || (sRap.compare("o")==0)){
    Je viens du Java, j'utilisait str.equals(str2) pour comparer de façon correct les string au lieu d'utiliser ==, est-ce pareille en c++?

    Secondo, j'utilise présentement VS 2005 pour mes projets c++, y a t'il un éditeur similaire à eclipse qui "highlight" les erreurs dynamiquement?

    Merci encore.

  5. #5
    Expert éminent
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 644
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 644
    Par défaut
    L'opérateur == de la classe std::string compare les chaines en respectant la case (mais c'est le aussi le cas de strcmp)...

    "Oui"=="oui" renvoie donc false si ce sont les valeurs de deux std::string

    Je ne sais plus si equals fait cette différence en java
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    84
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2008
    Messages : 84
    Par défaut
    Dernière question, j'ai besoin de rendre le input de l'utilisateur en lower case, j'ai vue la méthode toLower(), mais elle semble ne fonctionner que sur des tableaux de charatères?

    Comment suis-je supposer procéder si j'utilise le type "string"?

    Merci.

  7. #7
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Par défaut
    Bonjour,
    Probablement avec un algo de la STL :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    #include <iostream>
    #include <string>
    #include <algorithm>
    #include <functional>
    #include <cctype>
     
    int main() {
       std::string chaine("CouCou");
       std::transform(
          chaine.begin(),
          chaine.end(),
          chaine.begin(),
          //std::ptr_fun(std::tolower) -> marche avec Visual mais pas gcc probablement car utilise des int et non des char
          std::pointer_to_unary_function<int,int>(std::tolower)
       );
     
       std::cout<<chaine<<"\n";
      return 0;
    }

  8. #8
    Membre émérite
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    780
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Mai 2006
    Messages : 780
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    std::transform( s.begin(), s.end(), s.begin(), toupper );
    suffira je pense. ( non mais à part faire fuir les débutants là... )

    tu peux le mettre dans une fonction:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    void toupper( std::string & s)
    {
        std::transform( s.begin(), s.end(), s.begin(), toupper );
    }
    Sinon un bon vieux:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    void toupper( std::string & s )
    {
        for( int i=0; i<s.length();++i) 
        {
            s[i] = tolower(s[i]);
        }
    }
    si tu n'es pas à l'aise avec les algorithmes ( ce qui est normal, si tu débutes ).

    Et donc que font les gens maintenant en 2010? ben ils utilisent la librairie Boost avec:

    boost::to_upper() ou boost::to_lower() ou encore boost::to_lower_copy() etc..

  9. #9
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Par défaut
    Citation Envoyé par nikko34 Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    std::transform( s.begin(), s.end(), s.begin(), toupper );
    suffira je pense. ( non mais à part faire fuir les débutants là... )
    Oui. Effectivement. J'étais parti sur int std::toupper(int) et comme les arguments ne matchent pas exactement j'avais des pb avec gcc. Mais comme ça c'est beaucoup plus clair et sans problème.

  10. #10
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Par défaut
    D'ailleurs il y a une entrée dans la F.A.Q. : Comment convertir une string en minuscules / majuscules ?

  11. #11
    Membre confirmé
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    84
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2008
    Messages : 84
    Par défaut
    Citation Envoyé par nikko34 Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    void toupper( std::string & s )
    {
        for( int i=0; i<s.length();++i) 
        {
            s[i] = tolower(s[i]);
        }
    }
    Est-ce que le l'objet string est en fait une sorte d'alias pour un tableau de char à longeur variables?

    En d'autre mot, si j'utilise le type string je serai capable d'accéder à l'indice de chaque caractères a l'intérieur de celui-ci?

  12. #12
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Par défaut
    Citation Envoyé par Yakuzan Voir le message
    Est-ce que le l'objet string est en fait une sorte d'alias pour un tableau de char à longeur variables?
    string est une classe à part entière. La façon dont la chaine est effectivement instanciée est un détail d'implémentation. Tu peux t'appuyer sur son interface.

    Citation Envoyé par Yakuzan Voir le message
    En d'autre mot, si j'utilise le type string je serai capable d'accéder à l'indice de chaque caractères a l'intérieur de celui-ci?
    La classe string a un opérateur[] qui permet d'accéder à chacun des éléments, mais aussi beaucoup d'autres choses. Tout dépend de ce que tu veux faire.

  13. #13
    Membre émérite
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    780
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Mai 2006
    Messages : 780
    Par défaut
    Le C++ possède une bibliothèque standard de classes utilitaires comme std::string, std::vector etc.. qu'il est conseillé d'utiliser dans la plupart des cas, plutôt que des types bruts ou des tableaux sous la forme de pointeurs.

  14. #14
    Membre confirmé
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    84
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2008
    Messages : 84
    Par défaut
    Salut, autre question:

    Pourquoi:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    do{cout << "Entrez le format des photos[petit/moyen/grand/jumbo]:\n";
    		cin >> var.format;}
    		while( var.format.compare("petit") && (var.format != "moyen") && (var.format != "grand") && (var.format != "jumbo") );
    Cela fonctionne^

    Et que le code suivant continue à me répéter le cout même quand j'écris une bonne réponse.(Ex : petit) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    do{cout << "Entrez le format des photos[petit/moyen/grand/jumbo]:\n";
    		cin >> var.format;}
    		while( var.format.compare("petit") || (var.format != "moyen") || (var.format != "grand") || (var.format != "jumbo") );
    En java j'aurais utilisé le second bout de code et cela fonctionnerais avec des || tout simplement.


    Merci

  15. #15
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Par défaut
    Bonjour,
    Question de logique.
    Si var.format vaut "petit", alors var.format != "moyen" est vrai, car "petit" est différent de "moyen". Donc la condition est toujours vraie.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. C++ error C2664 appel de fonction
    Par lightalex01 dans le forum C++
    Réponses: 4
    Dernier message: 05/02/2012, 22h23
  2. Bus error et strcmp
    Par scls19fr dans le forum Débuter
    Réponses: 4
    Dernier message: 18/04/2009, 15h05
  3. error C2664: 'SetConsoleTitleW'
    Par pi-2r dans le forum C
    Réponses: 3
    Dernier message: 27/08/2007, 10h38
  4. [CR] Print Engine error text
    Par afaraji dans le forum SAP Crystal Reports
    Réponses: 1
    Dernier message: 03/09/2002, 15h44
  5. [Kylix] Runtime error 230 avec INDY
    Par Anonymous dans le forum EDI
    Réponses: 2
    Dernier message: 23/03/2002, 11h51

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo