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 :

Passer une concaténation à une fonction ?


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Juin 2002
    Messages
    36
    Détails du profil
    Informations forums :
    Inscription : Juin 2002
    Messages : 36
    Par défaut Passer une concaténation à une fonction ?
    Bonjour,

    Je débute en C, et je me demandais s'il est possible de passer une concaténation à une fonction.

    Exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    void exploiter_chaine(const char *texte)
    {
        /* j'utilise ma chaine pour l'ecrire dans un fichier, l'afficher, etc... */
    }
     
    int main(int argc, char * const argv[])
    {
        char *chaine="John";
        exploiter_chaine(strcat("Bonjour ", chaine));
        chaine = "Marie";
        exploiter_chaine(strcat("Bonjour ", chaine));
        return 0;
    }
    Quand j'utilise ce genre de chose, car je crois qu'on peut parler de chose , j'ai des choses bizarres dans la chaine que je récupère..., le deuxième appel de exploiter_chaine ne contient pas "Bonjour Marie", mais quelque chose comme "jour JohnBonjour Marie"...

    Je pense que je fais quelque chose pas bien du tout !

  2. #2
    Rédacteur
    Avatar de Franck.H
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2004
    Messages
    6 951
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Service public

    Informations forums :
    Inscription : Janvier 2004
    Messages : 6 951
    Par défaut
    Le mieux serais de créer un buffer temporaire (un espace de type char* alloué dynamiquement ou un tableau static si tu connais par avance la longueure de ta chaîne) qui contiendrais la chaîne puis le passer à la fonction, là c'est pas bon ce que tu fait !
    Mon Site
    Ma bibliothèque de gestion des chaînes de caractères en C

    L'imagination est plus importante que le savoir. A. Einstein

    Je ne répond à aucune question technique par MP, merci d'avance !

  3. #3
    Expert confirmé

    Avatar de fearyourself
    Homme Profil pro
    Ingénieur Informaticien Senior
    Inscrit en
    Décembre 2005
    Messages
    5 121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Ingénieur Informaticien Senior
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2005
    Messages : 5 121
    Par défaut
    Citation Envoyé par Franck.H
    Le mieux serais de créer un buffer temporaire (un espace de type char* alloué dynamiquement ou un tableau static si tu connais par avance la longueure de ta chaîne) qui contiendrais la chaîne puis le passer à la fonction, là c'est pas bon ce que tu fait !
    Je ne dirais pas "le mieux", le code présenté est faux.

    Une chaîne littérale n'est pas forcément dans une zone de texte modifiable. Aucune allocation suppléméntaire n'est faite pour ajouter derrière ces chaînes des informations.

    Donc n'importe quel ajout ou modification d'une chaîne littérale rend le code inutilisable.

    Jc

  4. #4
    Rédacteur
    Avatar de Franck.H
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2004
    Messages
    6 951
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Service public

    Informations forums :
    Inscription : Janvier 2004
    Messages : 6 951
    Par défaut
    Citation Envoyé par fearyourself
    Je ne dirais pas "le mieux", le code présenté est faux.
    C'est ce que je sous-entendais ... la prochaine fois je serais un peu plus direct alors
    Mon Site
    Ma bibliothèque de gestion des chaînes de caractères en C

    L'imagination est plus importante que le savoir. A. Einstein

    Je ne répond à aucune question technique par MP, merci d'avance !

  5. #5
    Membre averti
    Inscrit en
    Juin 2002
    Messages
    36
    Détails du profil
    Informations forums :
    Inscription : Juin 2002
    Messages : 36
    Par défaut
    Je ne dirais pas "le mieux", le code présenté est faux.
    Ha, alors je suis recalé ?


    Bon bon, je vais essayer de préciser ce que je veux faire et comment je comptais le faire, car je suis sûr que vos lumières seront un chemin de sagesse qu'il sera bon pour moi de suivre

    Je veux faire une fonction d'affichage de log, ayant les caractéristiques suivantes :
    - reçoit une chaine en paramètre
    - affiche sur stdout (printf ou autre ?) la chaine, préfixée par la date et l'heure formatées en AAAAMMJJ-HHMMSS
    - pas de valeur de retour

    Je veux pouvoir utiliser cette fonction en lui passant des chaines concaténées. (par exemple concatenation de "Itération numero " et "27" si vous voyez ce que je veux dire).

    Voici ce que j'ai pondu :

    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
     
    /*
    Juste un petit test de fonction d'affichage de chaine
    */
    #include <stdio.h> 
    #include <time.h> 
     
    /**
     * wlog
     * This function sends a timestamped message to stdout
     * In : 
     * string : message text
     * Out : 
     * Return : 
     */
    void wlog(const char *text)
    {
     char date_time[16];
     time_t ltime; 
     
     time(&ltime);
     strftime(date_time, sizeof date_time, "%Y%m%d-%H%M%S", localtime(&ltime));
     printf("[%s] %s\n", date_time, text);
    } /* wlog */
     
    int main(int argc, char * const argv[])
    {
     int i = 0;
     char *message = "";
     
     for (i=0; i<10; ++i)
     {
      sprintf(message, "Iteration numero %d ", i);
      wlog(message);
     }
     return 0;
    } /* main */

    Je me demande :
    - si l'affichage de la date ne peut pas être plus simple ?
    - si la déclaration de "message" est propre ?

    Merci de vos commentaires

  6. #6
    Membre confirmé
    Inscrit en
    Janvier 2006
    Messages
    74
    Détails du profil
    Informations personnelles :
    Âge : 55

    Informations forums :
    Inscription : Janvier 2006
    Messages : 74
    Par défaut
    Salut

    char *message = "";
    n'est pas bon. Tu utilises un pointeur sur une zone d'un seult caratere
    utilise plutot

    char message[MAXSIZE];

  7. #7
    Membre émérite Avatar de crocodilex
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    697
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 697
    Par défaut
    Citation Envoyé par Tittom
    Bonjour,

    Je débute en C, et je me demandais s'il est possible de passer une concaténation à une fonction.

    Exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    void exploiter_chaine(const char *texte)
    {
        /* j'utilise ma chaine pour l'ecrire dans un fichier, l'afficher, etc... */
    }
     
    int main(int argc, char * const argv[])
    {
        char *chaine="John";
        exploiter_chaine(strcat("Bonjour ", chaine));
        chaine = "Marie";
        exploiter_chaine(strcat("Bonjour ", chaine));
        return 0;
    }
    Quand j'utilise ce genre de chose, car je crois qu'on peut parler de chose , j'ai des choses bizarres dans la chaine que je récupère..., le deuxième appel de exploiter_chaine ne contient pas "Bonjour Marie", mais quelque chose comme "jour JohnBonjour Marie"...

    Je pense que je fais quelque chose pas bien du tout !
    Toi, tu n'as pas lu le man de strcat. Pourtant c'est très clair :
    #include <string.h>
    char *strcat (char *dest, const char *src);

    La fonction strcat() ajoute la chaîne src à la fin de la chaîne dest en écrasant le caractère `\0' a la fin de dest, puis en ajoutant un nouveau caractère `\0' final. Les chaînes ne doivent pas se chevaucher, et la chaîne dest doit être assez grande pour accueillir le resultat.

  8. #8
    Membre averti
    Inscrit en
    Juin 2002
    Messages
    36
    Détails du profil
    Informations forums :
    Inscription : Juin 2002
    Messages : 36
    Par défaut
    Citation Envoyé par Franck.H
    Le mieux serais de créer un buffer temporaire (un espace de type char* alloué dynamiquement ou un tableau static si tu connais par avance la longueure de ta chaîne) qui contiendrais la chaîne puis le passer à la fonction, là c'est pas bon ce que tu fait !
    Justement, ma question de fond consistait à tater le terrain pour voir s'il est possible de passer des chaines à une fonction, sans utiliser de buffer, par simple flemmardise. Mais je crois comprendre que le C n'aime pas les flemmards, et requiert rigueur et prévoyance dans la déclaration des structures destinées à manipuler les données ! Je me trompe ? (ce n'est pas une critique, c'est un constat )

    Citation Envoyé par crocodilex
    Toi, tu n'as pas lu le man de strcat. Pourtant c'est très clair
    J'imagine que ça fait partie des habitudes évidentes qu'un débutant - que je suis - doit prendre, en effet. Merci pour la remarque .

  9. #9
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par Tittom
    Bonjour,

    Je débute en C, et je me demandais s'il est possible de passer une concaténation à une fonction.

    Exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    void exploiter_chaine(const char *texte)
    {
        /* j'utilise ma chaine pour l'ecrire dans un fichier, l'afficher, etc... */
    }
     
    int main(int argc, char * const argv[])
    {
        char *chaine="John";
        exploiter_chaine(strcat("Bonjour ", chaine));
        chaine = "Marie";
        exploiter_chaine(strcat("Bonjour ", chaine));
        return 0;
    }
    Quand j'utilise ce genre de chose, car je crois qu'on peut parler de chose , j'ai des choses bizarres dans la chaine que je récupère..., le deuxième appel de exploiter_chaine ne contient pas "Bonjour Marie", mais quelque chose comme "jour JohnBonjour Marie"...

    Je pense que je fais quelque chose pas bien du tout !
    En C, il n'y a pas de magie. Si tu veux créer une chaine de caractères à partir d'autres (concaténation), il faut définir un tableau de char suffisament grand et recopier les chaines dedans.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
     char out[BIG_ENOUGH];
     
       strcpy(out, "Hello");   
       strcat(out, " ");   
       strcat(out, "world");
    ou
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
     sprintf (out, "%s %s", "Hello", "World");
    etc.

    Pour définir le tableau de destination, on peut calculer sa taille à partir des chaines à concaténer, sans oublier ce qu'il peut y avoir en plus (ici, un espace) et le 0 final... puis allouer le bloc avec malloc().

    Enfin, on peu se construire un objet chaine 'avancé' qui s'agrandit automatiquement selon les besoins (à coup de realloc() invisibles)...

    http://emmanuel-delahaye.developpez.com/clib.htm
    Module FSTR

  10. #10
    zul
    zul est déconnecté
    Membre chevronné Avatar de zul
    Profil pro
    Inscrit en
    Juin 2002
    Messages
    498
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 498
    Par défaut
    emmanuel il est l'heure d'aller te reposer Il faut lire bien sur

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
     char out[BIG_ENOUGH];
     
       strcpy(out, "Hello");   
       strcat(out, " ");   
       strcat(out, "world");
    ou

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
     sprintf (out, "%s %s", "Hello", "World");

  11. #11
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par zul
    emmanuel il est l'heure d'aller te reposer Il faut lire bien sur
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
     char out[BIG_ENOUGH];
     
       strcpy(out, "Hello");   
       strcat(out, " ");   
       strcat(out, "world");
    ou
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
     sprintf (out, "%s %s", "Hello", "World");
    Oui, merci. Corrigé. (Maudzit copié/collé...)

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

Discussions similaires

  1. Réponses: 0
    Dernier message: 17/02/2013, 20h27
  2. Concaténer une variable à une date
    Par Lamouette66 dans le forum SQL
    Réponses: 11
    Dernier message: 25/06/2012, 18h42
  3. [XL-2010] Affecter une couleur à une cellulle en fonction de son contenu
    Par ElPibeOro dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 05/04/2012, 15h54
  4. Passer attribut d'une JSP à une servlet
    Par ADBows dans le forum Servlets/JSP
    Réponses: 7
    Dernier message: 20/08/2011, 01h28
  5. Aide pour une ramener une info en fonction d'une date maximum
    Par dessinateurttuyen dans le forum SQL
    Réponses: 7
    Dernier message: 31/10/2008, 16h52

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