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 :

Quelques question sur string


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    48
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 48
    Par défaut Quelques question sur string
    Bonsoir à tous,

    J'étudie le livre Accelerated C++ et j'en suis au Chapter one , vraiment très intéressant.

    J'ai presque tout compris le fonctionnement de ce code:

    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
    20
    21
    22
    23
    24
    25
    26
    27
    #include <iostream>
    #include <string>
     
    int main()
    {
        std::cout << "What's your first name ? :" ;
        std::string name;
        std::cin >> name;
     
        const std::string message = "Hello " + name + "!" ;
        const std::string espaces(message.size(), ' ');
     
        const std::string second = "* " + espaces + " *";
     
        const std::string first(second.size(), '*');
     
     
        std::cout << std::endl ;
        std::cout << first << std::endl;
        std::cout << second << std::endl;
     
        std::cout << "* " << message << " *" << std::endl;
        std::cout << second << std::endl;
        std::cout << first << std::endl;
     
        return 0;
    }
    La seule chose que j'ai du mal c'est:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    const std::string espaces(message.size(), ' ');
    (message.size(), ' ');

    -size est ce quelque chose d'intégrer et non une simple variable ?

    Le fonctionnement de ce code serait donc :

    espaces de type string vaut un entier qui est égal à la longueur de message par ' ' ?

    Comment cela se fait il que message.size() compte le nombres de caractères/espaces alors qu'il n'y a pas de boucle pour parcourir la chaine ?

    Merci

  2. #2
    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
    Salut,

    La fonction membre (car c'est de cela qu'il s'agit) size() est... intégrée à la classe std::string, et renvoie le nombre de caractères que la chaine contient.

    C'est la raison pour laquelle on parle de fonction membre ou de méthode

    Pour le reste, le code "joue" avec d'autres méthodes de la classe: le constructeur, l'opérateur d'assignation et l'opérateur +.

    Pour faire simple, le constructeur est une fonction dont le but est de fournir un objet directement utilisable (tu l'aurais sans doute mauvaise si on te livrait ta voiture en pièces détachées, avec un jeu de tournevis, et que tu devais la monter toi-même ... ici, le principe est identique )

    Le C++ permet de "surcharger" les fonctions, c'est à dire qu'il est possible de créer plusieurs fonctions qui ont un même nom (sans doute parce que le but recherché est identique) mais qui utilisent différents arguments pour y arriver.

    Dans le cas de la classe string, il existe plusieurs surcharges du constructeur. De manière non exhaustive:
    • un qui ne prend aucun argument (constructeur par défaut)
    • un qui prend un tableau "C style" de caractères
    • un qui prend un nombre représentant la taille et un caractère
    • ...(j'ai l'impression d'en oublier)

    Lorsque tu déclares une variable sous la forme (selon ton code) de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    std::string espaces(str.size()," ");
    tu déclares une variable nommée espaces qui est construite avec le constructeur qui prend un nombre et un caractères (et qui aura pour conséquence de créer une chaine dans laquelle on trouve le nombre donné d'espaces, selon le code).

    Avec le code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    const std::string second = "* " + espaces + " *";
    tu déclares une autre chaine (nommée "second") à laquelle tu assigne (ca, c'est le " = ") la valeur "* " à laquelle tu ajoute (le premier "+") le contenu de la chaine espaces puis (le second "+") la valeur " *"
    La déclaration de la chaine first suit le même principe que celle de espaces (mais en plaçant un nombre doné d'étoile dans la chaine)
    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

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    48
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 48
    Par défaut
    Merci koala, ça devient plus claire.

    Donc size est comme en C (quand je bidouillais ) une fonction type strlen ... (pas le fonctionnement) simplement dire que elle est intégrée. Ok

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    48
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 48
    Par défaut
    Excusez moi du double post.

    J'ai voulu refaire ce code, en autonomie en changeant un peu.

    tout d'abord le code avec les problèmes

    -Pour enregistrez deux string sur un même cin, comment faire ? il ne me prend que le prenom;
    Une fois ça résolu j'essaierai de comprendre mes autres erreurs (concernant le framing).

    Merci

    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
    20
    21
    22
    23
    24
    25
    26
    27
    #include <iostream>
    #include <string>
     
    int main()
    {
    std::cout << "Comment t'appelles tu, syntaxe : (prenom nom ) ::";
    std::string nom;
    std::string prenom;
    std::cin >> prenom, nom;
     
    std::string bienvenue = "Hello " + prenom + nom + "!" ;
    std::string espaces (bienvenue.size(), ' ');
    std::string premiere_ligne (espaces.size(), 'o');
    std::string deuxieme_ligne = "s " + espaces + " s";
    std::string troisieme_ligne = "s " + bienvenue + " s";
     
     
     
    std::cout << std::endl << premiere_ligne;
    std::cout << std::endl << deuxieme_ligne;
    std::cout << std::endl << troisieme_ligne;
    std::cout << std::endl << premiere_ligne;
    std::cout << std::endl << deuxieme_ligne;
     
     
        return 0;
    }

  5. #5
    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,
    tu y étais presque !
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    std::cin >> prenom, nom;
    Attention, cette ligne ne signifie pas 'appel de l'opérateur >> avec 2 arguments prenom et nom'. En fait, un opérateur binaire s'applique sur l'opérande de gauche avec l'unique argument de droite. Et comme l'opérateur >> retourne un istream, ton code est équivalent à :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    std::cin>>prenom;
    std::cin,nom;
    Comme tu le vois, la seconde ligne ne fait rien (en fait, modulo que l'opérateur ',' ne soit pas défini).
    Donc, il faut tirer profit que l'opérateur >> retourne un istream pour enchaîner les appels :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    std::cin>>prenom>>nom;

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    48
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 48
    Par défaut
    Merci 3DArchi, j'ai compris et réussi. Mon code marche bien.

    Merci à tous !



    RESOLU

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

Discussions similaires

  1. Quelques questions sur les threads
    Par benj63 dans le forum C++Builder
    Réponses: 28
    Dernier message: 21/11/2005, 13h27
  2. Réponses: 19
    Dernier message: 21/10/2005, 19h24
  3. Quelques questions sur la mémoire
    Par Gruik dans le forum C
    Réponses: 6
    Dernier message: 17/11/2004, 14h38
  4. Quelques question sur Win 32 Appli
    Par lvdnono dans le forum Windows
    Réponses: 5
    Dernier message: 15/06/2004, 12h37
  5. Quelques questions sur le TWebBrowser...
    Par CorO dans le forum Web & réseau
    Réponses: 3
    Dernier message: 17/01/2003, 21h23

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