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 :

Concaténation en C++


Sujet :

C++

  1. #1
    Membre à l'essai Avatar de catzy
    Homme Profil pro
    Being human
    Inscrit en
    Octobre 2018
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Aveyron (Midi Pyrénées)

    Informations professionnelles :
    Activité : Being human

    Informations forums :
    Inscription : Octobre 2018
    Messages : 15
    Points : 10
    Points
    10
    Par défaut Concaténation en C++
    Bonjour ,

    Il parait que pour concaténer deux chaines de caractères, il faut utiliser l'opérateur + :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    #include <string>
    #include <iostream>
     
    using namespace std;
     
    int main()
    {
        cout << "Hello " + "world!" << endl;
    }
    Pourtant, il y a une erreur ligne 9 :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    error: invalid operands of types 'const char [7]' and 'const char [7]' to binary 'operator+'|
    Vous pouvez m'aider ?

    PS : Je sais qu'on peut utiliser << avec cout, mais justement, je veux pouvoir les concaténer SANS utiliser cout...

  2. #2
    Membre à l'essai Avatar de catzy
    Homme Profil pro
    Being human
    Inscrit en
    Octobre 2018
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Aveyron (Midi Pyrénées)

    Informations professionnelles :
    Activité : Being human

    Informations forums :
    Inscription : Octobre 2018
    Messages : 15
    Points : 10
    Points
    10
    Par défaut
    Par contre, on peut les concaténer si 1 des 2 chaines est dans une variable :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    #include <string>
    #include <iostream>
     
    using namespace std;
     
    int main()
    {
        string world("world!");
        cout << "Hello " + world << endl;
    }

  3. #3
    Expert éminent sénior
    Homme Profil pro
    Analyste/ Programmeur
    Inscrit en
    Juillet 2013
    Messages
    4 630
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Analyste/ Programmeur

    Informations forums :
    Inscription : Juillet 2013
    Messages : 4 630
    Points : 10 556
    Points
    10 556
    Par défaut
    Citation Envoyé par Zywyz Voir le message
    Il parait que pour concaténer deux chaines de caractères, il faut utiliser l'opérateur +
    Pour une explication plus détaillée : le C++ hérite du C : donc une chaîne de caractères, c'est un tableau de caractères. il y a 2 types - char (1 octet) ou wchar_t (soit 2 soit 4 octets).
    Mais ces 2 types sont des P.O.D. (Plain Old Data) (<- lien en anglais) : en gros ce sont des morceaux de mémoire - et donc la concaténation automatique n'est pas possible

    Mais en C++, on a une surcouche objet (qui permet de surcharger les opérateurs, et notamment l'opérateur +) et la bibliothèque standard stl qui apporte entre autres, la classe std::string.
    Et effectivement, on peut concaténer 2 std::string parce que cette classe le permet.

    Et un dernier point, il y a les conversions implicites qui viennent du C : lorsque tu codes
    • "world!" -> c'est un [const] char*
    • "Hello " + world -> la chaîne "Hello " est convertie en std::string. Mais il faut faire attention à la partie la plus à gauche, parce que, en théorie, les conversions se sont de gauche à droite.

  4. #4
    Membre expert
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2011
    Messages
    739
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2011
    Messages : 739
    Points : 3 627
    Points
    3 627
    Par défaut
    Concernant le dernier point de foetus:

    On peut faire hello + "World" avec hello un std::string.

    On peut aussi faire hello + "World" + "!" car le compilateur va traduire cela en (hello + "World") + "!", donc une concaténation de std::string avec "!".

    Mais on ne peut pas faire "Hello" + "World" + exclamation parce que dans "Hello" + "World" il n'y a pas de std::string.

  5. #5
    Membre à l'essai Avatar de catzy
    Homme Profil pro
    Being human
    Inscrit en
    Octobre 2018
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Aveyron (Midi Pyrénées)

    Informations professionnelles :
    Activité : Being human

    Informations forums :
    Inscription : Octobre 2018
    Messages : 15
    Points : 10
    Points
    10
    Par défaut
    Merci, donc j'ai qu'à faire comme ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    #include <string>
    #include <iostream>
     
    using namespace std;
     
    int main()
    {
        cout << string("Hello ") + "world!" << endl;
    }
    Ou alors (ça fait plus joli) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    #include <string>
    #include <iostream>
     
    using namespace std;
     
    int main()
    {
        const string concat("");
     
        cout << concat + "Hello " + "world!" << endl;
    }
    Merci

  6. #6
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Juin 2009
    Messages
    4 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 481
    Points : 13 679
    Points
    13 679
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par foetus Voir le message
    "Hello " + world -> la chaîne "Hello " est convertie en std::string. Mais il faut faire attention à la partie la plus à gauche, parce que, en théorie, les conversions se sont de gauche à droite.
    Je ne pense pas que "Hello" soit convertie en std::string, je pense simplement que cette opération utilise l'opérateur qui va bien (*) pour ajouter les données pointées par par le const char* "Hello" à la std::string word
    (*) voir https://en.cppreference.com/w/cpp/st...ng/operator%2B forme (2)



    Citation Envoyé par Zywyz
    Merci, donc j'ai qu'à faire comme ça :
    Tu n'as surtout qu'à faire ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    #include <iostream>
     
    int main()
    {
       std:: cout << "Hello ") << "world!" << std::endl;
    }

  7. #7
    Membre à l'essai Avatar de catzy
    Homme Profil pro
    Being human
    Inscrit en
    Octobre 2018
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Aveyron (Midi Pyrénées)

    Informations professionnelles :
    Activité : Being human

    Informations forums :
    Inscription : Octobre 2018
    Messages : 15
    Points : 10
    Points
    10
    Par défaut
    Citation Envoyé par Bktero Voir le message
    Je ne pense pas que "Hello" soit convertie en std::string, je pense simplement que cette opération utiliser l'opérateur qui va bien (*) pour ajouter les données pointées par par le const char* "Hello" à la std::string word
    (*) voir https://en.cppreference.com/w/cpp/st...ng/operator%2B forme (2)
    Dsl, mais là, j'ai rien compris...

    Citation Envoyé par Bktero Voir le message
    Tu n'as surtout qu'à faire ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    #include <iostream>
     
    int main()
    {
       std:: cout << "Hello ") << "world!" << std::endl;
    }
    J'ai utilisé cout pour pouvoir tester rapidement si ça marche, mais à la base, je voulais faire quelque chose dans le genre : (Et je voulais éviter de créer un flux ou un truc dans le genre juste pour pouvoir utiliser les chevrons ^^')
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    #include <string>
     
    using namespace std;
     
    int main()
    {
        string chaine = "Hello " + "world!";
     
        return 0;
    }

  8. #8
    Expert éminent sénior
    Homme Profil pro
    Analyste/ Programmeur
    Inscrit en
    Juillet 2013
    Messages
    4 630
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Analyste/ Programmeur

    Informations forums :
    Inscription : Juillet 2013
    Messages : 4 630
    Points : 10 556
    Points
    10 556
    Par défaut
    Citation Envoyé par Zywyz Voir le message
    Dsl, mais là, j'ai rien compris...
    Là on touche à des chapitres plus complexes : la redéfinition d'un opérateur et la notion friend.

    Et Bktero a raison , il y a un opérateur + friend qui prend à gauche une chaîne de caractères const char* et à droite une chaîne de caractères std::string.

    template< class CharT, class Traits, class Alloc > basic_string<CharT,Traits,Alloc> operator+(const CharT* lhs, basic_string<CharT,Traits,Alloc>&& rhs ); -> donc pas de conversion implicite.

  9. #9
    Membre à l'essai Avatar de catzy
    Homme Profil pro
    Being human
    Inscrit en
    Octobre 2018
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Aveyron (Midi Pyrénées)

    Informations professionnelles :
    Activité : Being human

    Informations forums :
    Inscription : Octobre 2018
    Messages : 15
    Points : 10
    Points
    10
    Par défaut
    Citation Envoyé par foetus Voir le message
    Là on touche à des chapitres plus complexes : la redéfinition d'un opérateur et la notion friend.
    Bon bah je vais me contenter de la technique "plus jolie"

    (Tout ça pour une concaténation quand même hein...)

    Merci

  10. #10
    gl
    gl est déconnecté
    Rédacteur

    Homme Profil pro
    Inscrit en
    Juin 2002
    Messages
    2 165
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Juin 2002
    Messages : 2 165
    Points : 4 637
    Points
    4 637
    Par défaut
    Sur un compilateur récent (supportant C++14) et en activant C++14, il est aussi possible d'utiliser des littéraux de type std::string :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    #include <iostream>
     
    int main()
    {
       std:: cout << "Hello "s + "world!"s << std::endl;
    }

  11. #11
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Juin 2009
    Messages
    4 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 481
    Points : 13 679
    Points
    13 679
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par Zywyz Voir le message
    Dsl, mais là, j'ai rien compris...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    template< class CharT, class Traits, class Alloc >
        basic_string<CharT,Traits,Alloc>
            operator+( const CharT* lhs,
                       const basic_string<CharT,Traits,Alloc>& rhs );
    C'est vrai que ce n'est pas facile à lire pour un novice...

    En gros, tu peux en déduire qu'il existe un opérateur comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    std::string operator+(const char* lhs, const std::string& rhs);
    C'est lui est appelé quand tu fais :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    std::string result = "Hello" + std::string("word");
    lhs est "Hello", un const char* ; rhs est la chaîne temporaire créée avec std::string("word"). Stricto sensu, "Hello" n'est pas converti std::string.

    gl a donné la meilleure solution à mon avis !

  12. #12
    Membre à l'essai Avatar de catzy
    Homme Profil pro
    Being human
    Inscrit en
    Octobre 2018
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Aveyron (Midi Pyrénées)

    Informations professionnelles :
    Activité : Being human

    Informations forums :
    Inscription : Octobre 2018
    Messages : 15
    Points : 10
    Points
    10
    Par défaut
    Citation Envoyé par gl Voir le message
    Sur un compilateur récent (supportant C++14) et en activant C++14, il est aussi possible d'utiliser des littéraux de type std::string :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    #include <iostream>
     
    int main()
    {
       std:: cout << "Hello "s + "world!"s << std::endl;
    }
    Citation Envoyé par Bktero Voir le message
    En gros, tu peux en déduire qu'il existe un opérateur comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    std::string operator+(const char* lhs, const std::string& rhs);
    C'est lui est appelé quand tu fais :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    std::string result = "Hello" + std::string("word");
    lhs est "Hello", un const char* ; rhs est la chaîne temporaire créée avec std::string("word"). Stricto sensu, "Hello" n'est pas converti std::string.

    gl a donné la meilleure solution à mon avis !
    Ah bah oui

    Au final, le C++ c'est un peu plus compliqué que le js

    Encore une fois merci pour les réponses

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

Discussions similaires

  1. Concaténation de 2 select en 1 seul
    Par Fleep dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 08/08/2003, 11h38
  2. Char(x) -> chaine concaténée d'espaces ?
    Par rgz dans le forum Débuter
    Réponses: 7
    Dernier message: 27/06/2003, 11h59
  3. Concaténation vertical ???
    Par loaded dans le forum Langage SQL
    Réponses: 10
    Dernier message: 07/05/2003, 15h44
  4. Concaténer TStrings
    Par Tuxxy dans le forum Composants VCL
    Réponses: 8
    Dernier message: 07/03/2003, 12h30
  5. Concaténation de String et Integer
    Par Ingham dans le forum Langage
    Réponses: 5
    Dernier message: 21/01/2003, 17h26

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