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, chaîne de caractères


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    bul
    bul est déconnecté
    Membre confirmé Avatar de bul
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    195
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 195
    Par défaut concaténation, chaîne de caractères
    bonjour à tous,
    une question minable d'un débutant
    avec Dev-C++ sous Windows
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    int WINAPI WinMain (HINSTANCE hThisInstance,
                        HINSTANCE hPrevInstance,
                        LPSTR LigneCde,
                        int nFunsterStil)
    ... char *Prm[2];        // table des paramètres
        LPSTR car=LigneCde;  // ligne de commande
        int adr=0;
    ... strcat(Prm[adr],*car);
    erreur : invalid conversion from 'char' to 'const char'
    sur le strcat
    pouvez-vous m'expliquer ?
    me dire comment faire ?

    j'explique ce que je fais ?
    étude de la ligne de commande, mémorisation des
    paramètres dans un tableau pour les utiliser ensuite.
    exemple :
    "c:/mes documents.../ex.tmp" param2 'p 3 si espaces' ... ==>
    Prm[0]=c:/mes documents.../ex.tmp
    Prm[1]=param2
    Prm[2]=p 3 si espaces ...
    peut-être me trompe-je totalement ? je
    fais comme j'aurais fait avec un autre
    langage...
    merci d'avance.
    @+

  2. #2
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Par défaut
    car est une chaîne de caractères, donc *car est un caractère. Or strcat attend une chaîne, d'où ton erreur de type.

    En plus tu n'alloues pas de mémoire pour tes chaînes -> ça aurait fait boum à l'execution.

    Je te conseille de faire un tour par la FAQ C++

    http://c.developpez.com/faq/cpp/?page=strings

    Sinon, je ne sais pas comment est structurée la ligne de commande avec WinMain (je crois que les paramètres sont séparés par un \0 et la fin de la chaîne est marquée par un \0\0), mais la MSDN te dira tout ce que tu dois savoir.

  3. #3
    bul
    bul est déconnecté
    Membre confirmé Avatar de bul
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    195
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 195
    Par défaut
    merci de l'aide
    désolé de n'avoir pas trouvé la FAQ adhéquate.
    je lis et si je ne comprend pas, ce qui est tout à
    fait possible compte tenu de mon niveau, je reviens.
    @+

  4. #4
    Expert confirmé

    Homme Profil pro
    pdg
    Inscrit en
    Juin 2003
    Messages
    5 756
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : pdg

    Informations forums :
    Inscription : Juin 2003
    Messages : 5 756
    Billets dans le blog
    3
    Par défaut
    La FAQ a pour but d'expliquer, donc n'hésite pas à citer les passages obscures qu'on les améliore

  5. #5
    bul
    bul est déconnecté
    Membre confirmé Avatar de bul
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    195
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 195
    Par défaut
    tout m'a semblé clair
    [ enfin de ce que j'ai lu ]
    ça commence à fonctionner mais
    j'ai une erreur de logique que je
    ne vois pas.
    pouvez-vous encore (!!) m'aider ?

    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
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
     
     
    ...
        string Prm[2];
        LPSTR car=LigneCde;  // ligne de commande
        bool encours=false;  // en cours de mémoristion ?
        char fin='\0';       // séparateur de fin
        const int arret=0;
        int adr=-1;
        while ( *car!=arret )
          { if ( encours )   // un paramètre est en cours de mémorisation
               { if ( *car!=fin && *car!=arret ) // est-ce la fin ?
                    { Prm[adr]+=car;             // oui : mémoriser
                    }
                 else                            // non
                    { if ( adr < 2 )  
                      {  encours=false;          // 3 postes maxi
                      }
                    } 
               }
            else            // début ou entre les paramètres
               { switch (*car)
                   { case '"' :                  // " ou '
                     case '\'' :                 // fin devra être " ou '
                          fin=*car;
                          adr++;
                          encours=true;
                          break;
                     case ' ' :                  // ignorer les espaces
                     case arret:                 // fin de la ligne de commande
                          break;
                     default:                    // sinon, 1er caractère
                          Prm[adr]=car;          // le mémoriser
                          fin=' ';               // fin = espace
                          adr++;
                          encours=true;
                          break; 
                   } 
               }
            car++;   
    }
    si je lance : programme A ,le 1er paramètre = A
    si je lance : programme AB ,le 1er paramètre = ABB
    si je lance : programme ABC ,le 1er paramètre = ABCBCC
    si je lance : programme "A" ,le 1er paramètre = A"
    ...
    je dois me mélanger les yeux ...
    merci d'avance.

  6. #6
    Expert confirmé

    Homme Profil pro
    pdg
    Inscrit en
    Juin 2003
    Messages
    5 756
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : pdg

    Informations forums :
    Inscription : Juin 2003
    Messages : 5 756
    Billets dans le blog
    3
    Par défaut
    Utilise std::string et sa fonction membre find, ça sera plus simple. Fais aussi une recherche sur la fonction split() donnée sur ce forum.

  7. #7
    bul
    bul est déconnecté
    Membre confirmé Avatar de bul
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    195
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 195
    Par défaut
    merci encore pour l'aide,
    donc finalement :

    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
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
     
    int WINAPI WinMain (HINSTANCE hThisInstance,
                        HINSTANCE hPrevInstance,
                        LPSTR LigneCde,
                        int nFunsterStil)
    { ...
        string Prm[2];
        LPSTR car=LigneCde;   // ligne de commande
        bool encours=false;   // en cours de mémoristion ou pas
        char fin='\0';        // séparateur, fin de paramètre
        const int arret=0;    // fin de la ligne de commande
        int adr=-1;           // n° poste où mémoriser le paramètre
        while ( *car!=arret ) // pour tous les caractères de la ligne de commande
          { if ( encours )    // un paramètre est en cours de mémorisation
               { if ( *car!=fin && *car!=arret ) // est-ce la fin ?
                    { Prm[adr]+=car[0];  }       // non : mémoriser
                 else                            // oui : passer au poste
                    { if ( adr < 2 )             //   suivant si nombre
                      {  encours=false;  } } }   //   maxi non atteint
            else              // début ou "entre" les paramètres
               { switch (*car)
                   { case '"' :                  // " ou '
                     case '\'' :                 // fin devra être " ou '
                          fin=car[0];
                          adr++;
                          encours=true;
                          break;
                     case ' ' :                  // ignorer les espaces
                     case arret:                 // fin de la ligne de commande
                          break;
                     default:                    // sinon, 1er caractère
                          fin=' ';
                          adr++;
                          encours=true;
                          Prm[adr]=car[0];       //     que l'on mémorise
                          break;  } }
            car++; }
    mais j'avoue ne pas tout comprendre
    _ car c'est un pointeur
    _ *car!=arret teste 1 caractère, pourquoi pas car[0]
    _ fin=car[0] transfert 1 caractère, pourquoi pas *car
    _Prm[adr]=car tranférerait les caractères jusqu'à \0
    je note résolu
    merci. @+

  8. #8
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Par défaut
    _ *car!=arret teste 1 caractère, pourquoi pas car[0]
    _Prm[adr]=car tranférerait les caractères jusqu'à \0
    - *car et car[0] sont en fait équivalents

    - Prm[adr] = car ferait simplement pointer Prm[adr] sur la même chaîne que car, il n'y aurait aucune recopie d'effectuée. Donc quand car est détruit, Prm[adr] pointe sur une zone mémoire non valide. Pour effectuer une recopie de chaîune, il faut utiliser strcpy. Mais tout ça c'est du C, on peut faire bien mieux en C++ avec std::string.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR CmdLine, int nCmdShow) 
    {
        std::vector<std::string> Tab;
        Split(CmdLine, Tab, " ");
     
        return 0;
    }
    La fonction Split est assez courante, tu pourras en trouver un peu partout et plus particulièrement sur ce forum avec la recherche avancée.

    Ou alors, sans fonction Split (puisque les paramètres ne sont séparés que par des espaces) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR CmdLine, int nCmdShow) 
    {
        std::istringstream iss(CmdLine);
        std::vector<std::string> Tab(std::istream_iterator<string>(iss), (std::istream_iterator<string>()));
     
        return 0;
    }

  9. #9
    bul
    bul est déconnecté
    Membre confirmé Avatar de bul
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    195
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 195
    Par défaut
    merci pour toutes ces explications,
    les choses commencent à être un
    peu plus claires.
    je savais (?!) qu'il existerait un solution
    toute faite répondant à mon problème,
    mais y aurais-je appris plus ?
    merci encore, et je reviendrais sûrement
    avec d'autres interrogations aussi bébétes.
    @+

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

Discussions similaires

  1. Concaténation chaînes de caractères
    Par kedmard dans le forum Requêtes et SQL.
    Réponses: 2
    Dernier message: 22/03/2012, 12h15
  2. [MySQL] concaténation chaîne de caractères : exclusion de certains caractères
    Par johnlito dans le forum PHP & Base de données
    Réponses: 7
    Dernier message: 04/01/2012, 15h41
  3. [iTEXT] concaténation chaîne de caractére et variable
    Par jeremlerugbyman dans le forum Documents
    Réponses: 1
    Dernier message: 06/05/2010, 08h53
  4. [WD10] Erreur concaténation chaîne de caractères
    Par COLOMBAT dans le forum WinDev
    Réponses: 6
    Dernier message: 20/04/2010, 10h28
  5. Concaténation chaîne de caractères
    Par vince29 dans le forum Cobol
    Réponses: 19
    Dernier message: 21/12/2007, 14h46

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