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 :

Explication chaine de caractères


Sujet :

C++

  1. #1
    Membre habitué
    Inscrit en
    Juillet 2006
    Messages
    8
    Détails du profil
    Informations forums :
    Inscription : Juillet 2006
    Messages : 8
    Par défaut Explication chaine de caractères
    Problème de caractères:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    //chaine de caractère servant pour la recherche
    const char *s = "CREATE PROCEDURE dbo.SP_IR_INFO_BLI (@SupportNO ";
    int taille = end - deb;
    // deb = index du 'P' de 'PROCEDURE'
    //end = index de '('
    char *new_s = new char[taille];
    for (i = deb ; i < end; i++)
    {
        new_s[i-deb] = s[i];
    }else {
        cout<<"Memoire insuffisante"<<endl;
    } 
    cout<<endl<<new_s<<endl;
    j'obtiens bien ma chaine de caractères mais suivi de symbole spéciaux. En fait, ma chaine de caractère est + gde que 'taille'.

    Merci pour ttes vos explications

  2. #2
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    Une chaîne de caractère doit être terminée par un caractère nul. Il faut donc de la place pour ledit caractère, et il faut l'écrire soi-même si on n'utilise pas les fonctions fournies...
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  3. #3
    Membre éclairé Avatar de vdumont
    Profil pro
    Étudiant
    Inscrit en
    Février 2006
    Messages
    510
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : Canada

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2006
    Messages : 510
    Par défaut
    Voila, prévoir 1 espace de plus pour le caractère nul. Utilise des std::string si possible. Ca t'évitera des ennuis.

  4. #4
    Membre éclairé Avatar de befalimpertinent
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    561
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Avril 2007
    Messages : 561
    Par défaut
    Citation Envoyé par jlsmith Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    for (i = deb ; i < end; i++)
    {
        new_s[i-deb] = s[i];
    }else {
        cout<<"Memoire insuffisante"<<endl;
    }
    ça compile ça ! ?

  5. #5
    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
    3
    4
    5
    6
    7
    8
     
    #include <string>
     
    ...
     
    const std::string s = "CREATE PROCEDURE dbo.SP_IR_INFO_BLI (@SupportNO ";
     
    std::string new_s = s.substr( deb, taille );
    mais oui, il faut que ta chaîne finisse par un '\0'. Mais même en C tu ne ferais pas comme ça

  6. #6
    Membre éclairé Avatar de vdumont
    Profil pro
    Étudiant
    Inscrit en
    Février 2006
    Messages
    510
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : Canada

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2006
    Messages : 510
    Par défaut
    mais oui, il faut que ta chaîne finisse par un '\0'. Mais même en C tu ne ferais pas comme ça
    Euh, les std::string n'ont pas besoin de \0 a la fin.

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

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 635
    Par défaut
    Salut,

    Je comprend que, si tu as commencé par apprendre le C, tu aie tendance à utiliser des char* pour représenter tes chaines de caractères.

    Cependant, le C++, bien qu'il soit compatible avec certaines caractéristiques du C (ben oui, on ne renie pas ses origines ) est différents à bien des égards du C, entre autres parce qu'il s'agit d'un langage clairement orienté objet.

    Ainsi, on trouve entre autres, de manière tout à fait standard, une classe particulière qui a pour but de gérer les chaînes de caractères, en nous évitant tous les problèmes liés à l'utilisation de tableaux de caractères "C style", et de manière bien plus sécurisée: il s'agit de la classe string, disponible dans l'espace de nommage std par inclusion du fichier d'en-tête <string>.

    Il est vraiment important, pour te faciliter la vie, de prendre l'habitude de gérer tes chaînes de caractères sous la forme de std::string tant que tu n'a pas besoin de faire autrement, autrement dit, tant que tu n'a pas explicitement besoin d'un tableau de caractères C style.

    Ainsi, selon ton exemple, tu pourrais partir, tout simplement sur un code du genre de
    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 <string>
    /* si tu veux pouvoir écrire string au lieu de std::string (mais évite
     * l'utilisaition de cette directive dans les en-têtes ;) */
    using namespace std;
    void fonction()
    {
        const string s="CREATE PROCEDURE dbo.SP_IR_INFO_BLI (@SupportNO ";
        /* si tu veux prendre une partie de la chaine, avec une position dans
         * la chaine "debut" et une "fin"
         */
        string sous_chaine=s.substring(debut, fin);
        /* si tu veux rajouter une information à cette sous chaine */
        sous_chaine+="le reste de la chaine codée en dur"
        /* ou, si c'est une autre chaine existante */
        sous_chaine+=lautrechaine;
        /* si, enfin, il faut vraiment que tu dispose d'une chaine C style */
        const char* scs=sous_chaine.c_str();
    }
    Tu remarquera que je ne me suis jamais inquiété de rajouter un '\0', ni même d'allouer de la mémoire dynamiquement...

    Je me suis, tout simplement, contenté d'utiliser les méthodes "qui vont bien" fournies par défaut par la classe.

    Tu trouvera plein d'info concernant la classe string dans la partie de la FAQ qui lui est consacrée... N'hésite pas à y faire un tour

    Niko>> d'un avis personnel, il pourrait t'être également utile d'y faire un tour
    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

  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
    oui je parlais des chaines de caractères C avec char* qui ont besoin du \0 à la fin. Non bien sûr des std::string, qui sont faites justement pour ne pas à s'en soucier.

    Et je te jure, la méthode substr() prend comme paramètre une position et une longueur, et pas deux positions.

  9. #9
    Membre habitué
    Inscrit en
    Juillet 2006
    Messages
    8
    Détails du profil
    Informations forums :
    Inscription : Juillet 2006
    Messages : 8
    Par défaut
    Problème Résolu, merci beaucoup pour vos réponses. Effectivement, j'ai utilisé des strings pour toutes déclarations et utilisations des chaines de caratères.
    La seul chose que j'ai utilisé du C est la fonction strstr pour obtenir la position d'une sous-chaine dans une chaine.

    Voila,
    byebye

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

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 635
    Par défaut
    Tu devrais peut etre te renseigner sur les méthode find et dérivées (rfind, find_first_of, find_last_of) qui sont spécialement conçues pour de nombreuses utilisations
    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

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

Discussions similaires

  1. Réponses: 9
    Dernier message: 23/12/2013, 16h40
  2. Crypter une chaine de caractères
    Par Yabo dans le forum Réseau
    Réponses: 18
    Dernier message: 19/11/2004, 23h04
  3. Réponses: 9
    Dernier message: 17/01/2003, 11h45
  4. Lire Une Chaine De Caractères
    Par Jonathan_Korvitch dans le forum C
    Réponses: 12
    Dernier message: 07/01/2003, 05h37
  5. Réponses: 2
    Dernier message: 06/12/2002, 07h50

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