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 :

Fonction avec comme retour une chaîne de caractères


Sujet :

C

  1. #1
    Futur Membre du Club
    Inscrit en
    Juin 2002
    Messages
    4
    Détails du profil
    Informations forums :
    Inscription : Juin 2002
    Messages : 4
    Points : 5
    Points
    5
    Par défaut Fonction avec comme retour une chaîne de caractères
    j'ai une petite fonction qui devrait me renvoyer une chaine de caractere. Or il ne me renvoie que des truc incohérents. Je sais qu'il faut utiliser des pointeurs de char mais dans ce cas, il ne me renvoie que la premiere lettre!!!
    voila mon code:

    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
    char *jourdelasemaine(time_t date)
    {						
       struct tm when;
       short unsigned int numjour;		
       char libjour[8],*libelle;	
       when = *localtime(&date);
       numjour=when.tm_wday;
       switch (numjour)
       {
         case 0 :	strcpy(libjour, "dimanche");
    		break;
         case 1 :	strcpy(libjour, "lundi");
    		break;
         case 2 :	strcpy(libjour, "mardi");
    		break;
         case 3 :	strcpy(libjour, "mercredi");
    		break;
         case 4 :	strcpy(libjour, "jeudi");
    		break;
         case 5 :	strcpy(libjour, "vendredi");
    		break;
         case 6 :	strcpy(libjour, "samedi");
    		break;
         default:    strcpy(libjour, "erreur");
    		break;
         }
    libelle=&libjour;
    return (&libjour);
     
    }
     
    void main( void )
    {
       time_t now;//, result;
       char libjour[8],*libel;
       libel=malloc(8);
     
       time( &now );
       libel=jourdelasemaine(now);
       &libjour = libel;
        printf("\n nous sommes un %s \n",libjour);

  2. #2
    Membre confirmé

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2002
    Messages
    137
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2002
    Messages : 137
    Points : 621
    Points
    621
    Par défaut
    boaf ! c'est normal que ça va pas, voici une petite correction de ta fonction :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    #include <string.h>
    ...
    libelle=strdup(libjour); 
    return (libelle);
    et là c'est le prog appellant qui doit libérer la mémoire car strdup fait une allocation avec malloc pour qu'au retour, les données existent toujours.

    sinon tu peux passer un char * en argument à ta fonction, ainsi que la taille maxi et y copier le résultat :
    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
    void jourdelasemaine(time_t date, char * lib, unsigned int max) 
    { 
         struct tm when; 
         short unsigned int numjour; 
         when = *localtime(&date); 
         numjour=when.tm_wday; 
         switch (numjour) 
         { 
              case 0 : strncpy(lib, "dimanche",max); 
                   break; 
              case 1 : strncpy(lib, "lundi",max); 
                   break; 
              ---
         } 
    }

  3. #3
    Membre du Club
    Inscrit en
    Mai 2002
    Messages
    22
    Détails du profil
    Informations forums :
    Inscription : Mai 2002
    Messages : 22
    Points : 43
    Points
    43
    Par défaut
    Il y a pas mal de problèmes dans ton code.

    mais déjà, dans ton main :

    Tu alloue de la mémoire pour ton pointeur libel, et en appelant ta fonction par :
    libel = jourdelasemaine(now); tu perds l'adresse qui t'avait été attribuée par malloc car il prend de cette façon, l'adresse renvoyée par ta fonction.

    ensuite, dans ta fonction :

    Tu fais la déclaration char libjour[8]; qui crée un pointeur constant et local à ta fonction. ce qui fait que dès que tu sors de ta fonction, la mémoire à cet endroit n'est plus allouée. Comme c'est justement cette adresse là que tu retourne et qui est récupérée par le libel de ton main, tu te retrouve avec un pointeur sur un espace non alloué et qui peut être corrompu à n'importe quel moment (et c'est d'ailleurs ce qui se produit en l'occurence).

    Si tu veux que le pointeur soit retourné par ta fonction, il faut que la mémoire soit allouée dynamiquement à l'intérieur de celle-ci, pour ne pas être libérée lors de la sortie de la fonction et d'autre part l'allocation que tu fais dans ton main est perdue.

  4. #4
    Membre du Club
    Inscrit en
    Mai 2002
    Messages
    22
    Détails du profil
    Informations forums :
    Inscription : Mai 2002
    Messages : 22
    Points : 43
    Points
    43
    Par défaut
    tient ! j'ai cru voir un gRRosminet me passer devant pendant que je tapais ma réponse !

  5. #5
    Membre confirmé

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2002
    Messages
    137
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2002
    Messages : 137
    Points : 621
    Points
    621
    Par défaut
    c'est pas grave : toi tu donne la réponse "théorique" et moi la réponse code, on se complète !

    au fait dans ma réponse, il faut pas passer un pointeur comme ça tout tranquille dans le vide, hein faut passer un pointeur avec de la mémoire derrière donc soit un tableau soit un pointeur sur lequel on a fait un malloc

  6. #6
    Futur Membre du Club
    Inscrit en
    Juin 2002
    Messages
    4
    Détails du profil
    Informations forums :
    Inscription : Juin 2002
    Messages : 4
    Points : 5
    Points
    5
    Par défaut
    merci!!!!
    ca marche du tonnerre maintenant.....

  7. #7
    Membre du Club
    Homme Profil pro
    etudiant / developpeur
    Inscrit en
    Décembre 2009
    Messages
    131
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : etudiant / developpeur

    Informations forums :
    Inscription : Décembre 2009
    Messages : 131
    Points : 69
    Points
    69
    Par défaut
    Desoler de sortir ce thread de ca tombe mais j'ai une petite question de debutant en C.

    je dois faire des librairie dynamic pour linux et j'ai besoin de retourner une chaine de char dans une de mes fonction.

    et donc je pose les questions suivantes au vu du code ci-dessu , laquelle des deux methode presenter est la meilleur dans la condition de ma librairie et pour la gestion memoire.

  8. #8
    Expert confirmé Avatar de fregolo52
    Homme Profil pro
    Développeur C
    Inscrit en
    Août 2004
    Messages
    2 366
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur C

    Informations forums :
    Inscription : Août 2004
    Messages : 2 366
    Points : 5 382
    Points
    5 382
    Par défaut
    Salut,

    Perso (lib ou fonction interne), je préfère avoir ma donnée de sortie dans les paramètres de ma fonction et avoir un code de retour en "int" pour savoir si ça c'est bien passé. ex:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    int fct (in, in, in, out);
    Citation Envoyé par 304bl Voir le message
    Desoler de sortir ce thread de ca tombe ...
    On ne pourra pas te reprocher de ne pas avoir utiliser la fonction "recherche".

  9. #9
    Membre du Club
    Homme Profil pro
    etudiant / developpeur
    Inscrit en
    Décembre 2009
    Messages
    131
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : etudiant / developpeur

    Informations forums :
    Inscription : Décembre 2009
    Messages : 131
    Points : 69
    Points
    69
    Par défaut
    oui cela semble etre la meilleur des methodes, de C a C je vois bien, mais comment de java ou d'un autre langage a partir de cette librairie et donc de cette fonction,je vais pouvoir recuperer la chaine, c'est la ou je visualize pas tres bien.

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 01/12/2013, 20h03
  2. Problème avec une chaîne de caractère en argument de fonction
    Par R3v3n4nt dans le forum Interfaces Graphiques
    Réponses: 0
    Dernier message: 09/03/2013, 14h10
  3. Réponses: 3
    Dernier message: 03/04/2012, 17h19
  4. Réponses: 4
    Dernier message: 27/09/2011, 23h27
  5. Réponses: 24
    Dernier message: 27/08/2010, 00h34

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