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

Réseau C Discussion :

Retourner chaine de caractères


Sujet :

Réseau C

  1. #1
    Membre éclairé
    Avatar de jmjmjm
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2005
    Messages
    760
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2005
    Messages : 760
    Par défaut Retourner chaine de caractères
    Comment retourner une chaîne de caractères dans une fonction ??

    j'ai une fonction qui lit un message socket et doit me renvoyer le message ??
    Désolé ca doit etre basic mais je suis habitué au c++ et a string qui n'existe malheureusement pas en C et je dois faire le projet en C :s

  2. #2
    Membre extrêmement actif

    Homme Profil pro
    Ingénieur R&D
    Inscrit en
    Juin 2003
    Messages
    4 506
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2003
    Messages : 4 506
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    char * MaFonc() {
      char buf[TAILLE];
      <..>
      return buf;
    }

  3. #3
    Rédacteur

    Avatar de gege2061
    Femme Profil pro
    Administrateur de base de données
    Inscrit en
    Juin 2004
    Messages
    5 840
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur de base de données

    Informations forums :
    Inscription : Juin 2004
    Messages : 5 840
    Par défaut
    Bonjour,

    un p'tit exemple : Copier une chaîne de caractères

    Une chaîne de caractères est un tableau de char terminé par un caractère nul. Il faut utiliser l'allocation dynamique de mémoire pour éviter les problème de destruction de variables locales (comme nous le montre hegros )

  4. #4
    Membre éclairé
    Avatar de jmjmjm
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2005
    Messages
    760
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2005
    Messages : 760
    Par défaut
    oué desolé pour ce post je viens de reparcourir la FAQ et j'ai vue que c'etait dedans (je l'avais pourtant regarder avant de poster :-( ca doit etre la fatigue !!)

  5. #5
    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 hegros
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    char * MaFonc() {
      char buf[TAILLE];
      <..>
      return buf;
    }
    Horrible !

  6. #6
    Membre éclairé
    Avatar de jmjmjm
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2005
    Messages
    760
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2005
    Messages : 760
    Par défaut
    Salut Emmanuel, j'ai fait ca en m'inspirant de la FAQ est ce bon ??

    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
     
    char *LectureMSQ(key_t Cle,long type)
    {
       char *Retour=NULL;
       message_t message;
       int msqid,length;
       message.type=type;
       length = sizeof(message_t)-sizeof(long);
     
       if ((msqid = msgget(Cle, IPC_CREAT | 0600))==-1) {
          perror("msgget");
          exit(EXIT_FAILURE);
       }
     
       if (msgrcv (msqid, &message, length, message.type, 0)>=0) {
          Retour=malloc((strlen(message.Nom)+1)*sizeof(Retour));
          if (Retour) strcpy(Retour,message.Nom);
       }
       else
          perror("msgrcv");
     
    //   msgctl(msqid,IPC_RMID, NULL);                            /* destruction */
       return Retour;

    Ma fonction sert a recevoir une file de message et a la retourner
    et apres dans le main j'ai fait
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    strcpy(Ma_Chaine,LectureMSQ(x,x));

  7. #7
    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
    Ca devrait aller. L'appelant doit tester la valeur (NULL : ne pas utiliser) et libérer le bloc dont il a reçu l'adresse, après usage.

  8. #8
    Membre éclairé
    Avatar de jmjmjm
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2005
    Messages
    760
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2005
    Messages : 760
    Par défaut
    oui en effet je n'ai pas liberer l'espace memoire mais comment faire ?? car ce n'ai pas une variable mais une fonction qui prend l'adresse non ?

  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 jmjmjm
    oui en effet je n'ai pas liberer l'espace memoire mais comment faire ?? car ce n'ai pas une variable mais une fonction qui prend l'adresse non ?
    Il faut mémoriser la valeur dans un pointeur, vérifier qu'elle est valide, l'utiliser, puis libérer le bloc pointé. Rien de très nouveau si tu sais utiliser fopen(), par exemple.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
       T *p = f();
       if (p != NULL)
       {
          /* usage de p... */   
     
     
          /* quand c'est fini */
          free (p), p = NULL;
       }

  10. #10
    Membre extrêmement actif

    Homme Profil pro
    Ingénieur R&D
    Inscrit en
    Juin 2003
    Messages
    4 506
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2003
    Messages : 4 506
    Par défaut
    Citation Envoyé par Emmanuel Delahaye
    Horrible !
    Beh je peux l'utiliser de la sorte sans que cela provoque un comportement indeterminé (pas testé pas compilé)

    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
    #include <stdio.h>
     
    char * MaFonc() {
      char buf[TAILLE];
      <..>
      return buf;
    }
     
     
    int main() {
     
      char buf[TAILLE];   
      printf("%s ", MaFonc());  //ceci ne pose pas de probléme si ?
      strcpy(buf,MaFonc());  //ceci ne pose pas de probléme aussi si ?  
      return 0 ;
    }

  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 hegros
    Beh je peux l'utiliser de la sorte sans que cela provoque un comportement indeterminé (pas testé pas compilé)
    Tu aurais dû le tester...
    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 <stdio.h>
    #include <string.h>
    #define TAILLE 32
    char *MaFonc ()
    {
       char buf[TAILLE];
       strcpy (buf, "hello world");
       return buf;
    }
     
    int main (void)
    {
       char buf[TAILLE];
       printf ("%s ", MaFonc ());   //ceci ne pose pas de probléme si ?
       strcpy (buf, MaFonc ());     //ceci ne pose pas de probléme aussi si ?
       printf ("%s ", buf);
       return 0;
    }
    Même gcc a vu le problème :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    Project   : Forums
    Compiler  : GNU GCC Compiler (called directly)
    Directory : C:\dev\forums2\
    --------------------------------------------------------------------------------
    Switching to target: default
    Compiling: main.c
    main.c: In function `MaFonc':
    main.c:8: warning: function returns address of local variable
    Linking console executable: console.exe
    Process terminated with status 0 (0 minutes, 1 seconds)
    0 errors, 1 warnings
    Quand au comportement...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    é8Ã☺ é8Ã☺
    Press ENTER to continue.
    Ce problème est archi connu, je ne comprends pas que tu sois passé à coté, tu n'es pas un débutant que je sache...

  12. #12
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 394
    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 394
    Par défaut
    Citation Envoyé par hegros
    Beh je peux l'utiliser de la sorte sans que cela provoque un comportement indeterminé (pas testé pas compilé)

    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
    #include <stdio.h>
     
    char * MaFonc() {
      char buf[TAILLE];
      <..>
      return buf;
    }
     
     
    int main() {
     
      char buf[TAILLE];   
      printf("%s ", MaFonc());  //ceci ne pose pas de probléme si ?
      strcpy(buf,MaFonc());  //ceci ne pose pas de probléme aussi si ?  
      return 0 ;
    }
    1. Ben si. Les variables locales de printf() écrasent ton tableau.
    2. Y'a des chances que là aussi.


    Edit: Argh, grillé.
    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.

  13. #13
    Membre extrêmement actif

    Homme Profil pro
    Ingénieur R&D
    Inscrit en
    Juin 2003
    Messages
    4 506
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2003
    Messages : 4 506
    Par défaut
    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
    #include <stdio.h>
    #include <string.h>
     
    #define TAILLE 32
     
    char * MaFonc() {
       char buf[TAILLE]={"Bonjour"};
      return buf;
    }
     
     
    int main() {
     
      char buf[TAILLE];
     
      printf("Avant strcpy %s \n", MaFonc());  //ceci ne pose pas de probléme si ?
      strcpy(buf,MaFonc());                     //ceci ne pose pas de probléme aussi si ?
      printf("Apres strcpy %s\n",buf);
     
      return 0 ;
    }

    Voici le résultat :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Avant strcpy
    Apres strcpy Bonjour
     
    Press ENTER to continue.
    Sinon effectivement mon compilateur me dit :

    Compiling: main.c
    main.c: In function `MaFonc':
    main.c:8: warning: function returns address of local variable
    Linking console executable: C:\dev\console.exe
    Process terminated with status 0 (0 minutes, 0 seconds)
    0 errors, 1 warnings
    Sinon oui c'est un probléme archi connu je ne retournerai pas l'adresse d'une variable locale d'une fonction mais pour dire que même en faisant le test on arrive pas forcément au même résultat.

  14. #14
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 394
    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 394
    Par défaut
    C'est donc bien un comportement indéfini, donc à fuir comme la télé éducative.
    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.

  15. #15
    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 hegros
    Sinon oui c'est un probléme archi connu je ne retournerai pas l'adresse d'une variable locale d'une fonction mais pour dire que même en faisant le test on arrive pas forcément au même résultat.
    Ben oui. C'est le propre d'un comportement indéfini...

    http://emmanuel-delahaye.developpez.com/notes.htm#ub

    Je ne vois pas bien ce que tu cherches à prouver. Tu t'es trompé, c'est tout. Y'a pas de quoi en faire un fromage.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    Avant strcpy À8Ã☺P "
    Apres strcpy À8Ã☺P "
     
    Press ENTER to continue.

  16. #16
    Membre extrêmement actif

    Homme Profil pro
    Ingénieur R&D
    Inscrit en
    Juin 2003
    Messages
    4 506
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2003
    Messages : 4 506
    Par défaut
    Citation Envoyé par Emmanuel Delahaye

    Je ne vois pas bien ce que tu cherches à prouver. Tu t'es trompé, c'est tout. Y'a pas de quoi en faire un fromage.
    Je ne cherche rien à prouver C'est une erreur de ma part d'avoir mis ce code certes ca m'apprendra de vouloir jouer aux apprentis sorciers et de vouloir retourner des adresses invalides

    J'espère que le posteur a bien compris le probléme afin de ne plus le reproduire

  17. #17
    Membre éclairé
    Avatar de jmjmjm
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2005
    Messages
    760
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2005
    Messages : 760
    Par défaut
    Ne vous inquietez pas j'ai compris et sa marche niquel merci a tous

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

Discussions similaires

  1. Longueur retourner pour une chaine de caractére
    Par locs dans le forum MS SQL Server
    Réponses: 0
    Dernier message: 10/09/2007, 15h19
  2. Retourner le premier caractère d'une chaine
    Par Sytchev3 dans le forum Langage
    Réponses: 2
    Dernier message: 08/08/2007, 19h21
  3. Réponses: 16
    Dernier message: 02/05/2007, 13h36
  4. Retourner une chaine de caractére
    Par insa59 dans le forum C
    Réponses: 22
    Dernier message: 23/03/2007, 17h29
  5. Réponses: 23
    Dernier message: 13/11/2006, 03h33

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