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 :

Retourner chaîne de caractères


Sujet :

C

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    27
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 27
    Points : 14
    Points
    14
    Par défaut Retourner chaîne de caractères
    Bonjour,
    Dans un programme j'aimerais faire retourner une chaîne par une fonction.
    J'ai trouvé ceci dans la FAQ :
    Pour retourner une chaîne de caractères, il faut passer à la fonction un pointeur en paramètres et copier la chaîne dans la zone mémoire pointée (avec strcpy() par ex.).

    Une autre façon de faire est de déclarer la fonction comme retournant un pointeur sur des caractères et d'allouer la mémoire dans la fonction sans la libérer dans celle-ci, mais dans la fonction appelante.
    Seulement j'aurais bien aimé un exemple avec, parce que j'ai du mal à saisir.


    Mon programme :
    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
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
     
    #include <stdio.h>
    #include <string.h>
    #include <stdlib.h>
     
    void concatener()
    {
     
        int ret;
        char temp[20];
        char axe1[5];
        char axe2[5];
        char axe3[5];
        char axe4[5];
        char envoi[21];
     
        /* Saisie du clavier vers axe1, grâce à fgets */
        do
        {      
          if (ret != 1) printf("Axe 1 : ");
          fflush (stdout);
          fgets (axe1, sizeof axe1, stdin);      
          ret = sscanf (axe1, "%[0-9-]s", temp);
        }
        while (ret != 1);
     
        /* Saisie du clavier vers axe2, grâce à fgets */
        do
        {      
          if (ret !=1 ) printf("Axe 2 : ");
          fflush (stdout);
          fgets (axe2, sizeof axe2, stdin);      
          ret = sscanf (axe2, "%[0-9-]s", temp);
        }
        while (ret != 1);
     
       /* Saisie du clavier vers axe3, grâce à fgets */
        do
        {     
          if (ret !=1 ) printf("Axe 3 : ");
          fflush (stdout);
          fgets (axe3, sizeof axe3, stdin);      
          ret = sscanf (axe3, "%[0-9-]s", temp);
        }
        while (ret != 1);
     
       /* Saisie du clavier vers axe4, grâce à fgets */
        do
        {
          if (ret !=1 ) printf("Axe 4 : ");
          fflush (stdout);
          fgets (axe4, sizeof axe4, stdin);      
          ret = sscanf (axe4, "%[0-9-]s", temp);
        }
        while (ret != 1);
     
        /* envoi va contenir T + axe1 + axe2 + axe3 + axe4 + 2048 */ 
        sprintf(envoi, "T%s%s%s%s2048", axe1, axe2, axe3, axe4);
    }
     
    int main ()
    {
        char coordonnees[21];
        concatener();
        return 0;
    }
    Ici la fonction concatener ne retourne rien.
    J'aimerais lui faire retourner la chaîne envoi dans la fonction main, à coordonnes.
    Quels changements dois-je appliquer ?
    Je vous remercie

  2. #2
    Expert éminent
    Avatar de PRomu@ld
    Homme Profil pro
    Ingénieur de Recherche
    Inscrit en
    Avril 2005
    Messages
    4 155
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Vienne (Poitou Charente)

    Informations professionnelles :
    Activité : Ingénieur de Recherche
    Secteur : Enseignement

    Informations forums :
    Inscription : Avril 2005
    Messages : 4 155
    Points : 6 486
    Points
    6 486
    Par défaut
    En gros :

    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
     
    char * retour()
    {
         char * ret;
         ret = malloc(la taille que tu veux);
         /* A ne pas oublier ! */
         if (ret == NULL)
         {
               /* tu gère les erreur */
         }
     
         /* tu fais tes modifications comme tu veux */
     
         return ret;
    }
     
    /* dans ton main */
    int main()
    {
         char * valeur;
     
         valeur = retour();
         /* tu fais ce que tu veux avec valeur */
     
     
         /* quand tu n'en n'a plus besoin */
         free(valeur);
         valeur = NULL;
     
         /* ... */
    }

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    27
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 27
    Points : 14
    Points
    14
    Par défaut
    Merci pour la réponse très claire, je vais essayer

  4. #4
    Membre averti
    Avatar de bigquick
    Profil pro
    Inscrit en
    Août 2002
    Messages
    356
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2002
    Messages : 356
    Points : 353
    Points
    353
    Par défaut
    Ou, seconde solution (la FAQ parle de 2 méthodes)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    void retour( char *p )
    {
       /* pour cette fonction il faut un pointeur valide */
       assert( p != NULL );
     
      /* traitements */
      strcpy(p, "test");
    }
    Ici il faut allouer la mémoire avant d'appeler la fonction, ce qui "pour certains" est plus lisible, puisque la mémoire est allouée et desallouée au même endroit. Rien n'oblige d'ailleurs à l'allouer dynamiquement:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    int main()
    {
       char* chaine1 = malloc( .... );
       retour( chaine1 );
       free( chaine1 );
     
    (ou)
     
       char chaine2[50];
       retour( chaine2 );
     
       return 0;
    }

    A toi de voir le plus pratique pour ton cas précis: il est pratique d'allouer dans la fonction si c'est dans celle-ci qu'on détermine la taille de la chaine par exemple
    And still we will be here, standing like statues ...

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    27
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 27
    Points : 14
    Points
    14
    Par défaut
    J'ai testé la méthode de PRomua@ld, ça fonctionne très bien,
    la tienne est peut-être mieux pensée, elle me servira sans doute aussi
    Merci à vous deux.

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

Discussions similaires

  1. Retourner une chaîne de caractères
    Par wallace27 dans le forum C
    Réponses: 8
    Dernier message: 11/03/2015, 08h54
  2. Réponses: 1
    Dernier message: 26/01/2013, 11h10
  3. Fonction retournant une chaîne de caractères
    Par lamyruth dans le forum C
    Réponses: 2
    Dernier message: 04/01/2010, 10h58
  4. Réponses: 5
    Dernier message: 15/02/2005, 18h07

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