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 une chaine de caractére


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Inscrit en
    Février 2007
    Messages
    191
    Détails du profil
    Informations forums :
    Inscription : Février 2007
    Messages : 191
    Par défaut Retourner une chaine de caractére
    Salut a tous

    Je voudrais que ma fonction retourner une chaine de caracteres mais cela n'est pas possible avec un return
    Donc je voulais savoir comment on peut faire???

  2. #2
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    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 395
    Par défaut
    Il est possible de retourner une chaîne statique avec un bète return (genre return "abc"), mais c'est plus compliqué si la chaîne est créée dynamiquement.
    Pour une chaîne créée, le mieux est d'utiliser l'allocation dynamique.

    Exemple:
    Code C non-testé : 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
    #include <stdlib.h>
    #include <stdio.h>
     
    char const * RetourneChaineStatique(int a)
    {
    	if(a > 10)
    		return "Plus que 10";
    	else
    		return "10 ou moins";
    }
     
    char * RetourneChaineDynamique(int a)
    {
    	/* Allocation dynamique : De la place pour 20 caractères */
    	char * pRet = malloc(20*sizeof(*pRet));
    	if(pRet != NULL)
    	{
    		sprintf(pRet, "a = %d", a);
    	}
    	return pRet;
    }
     
    int main(void)
    {
    	char * chnDyn = NULL;
     
    	puts(RetourneChaineStatique(42));
     
    	chnDyn = RetourneChaineDynamique(42);
    	if(chnDyn != NULL)
    	{
    		puts(chnDyn);
    		free(chnDyn); /* Le free() pourrait être hors du if, le standard dit que free(NULL) ne fait rien. */
    	}
    	return 0;
    }
    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.

  3. #3
    Membre Expert
    Avatar de Gruik
    Profil pro
    Développeur Web
    Inscrit en
    Juillet 2003
    Messages
    1 566
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Juillet 2003
    Messages : 1 566
    Par défaut
    2 autres methodes :

    * Retourner un pointeur sur buffer statique / global-privé. Avantage : pas à se prendre la tete avec la libération. Inconvenient : les appels à la fonction ecrasent la valeur precedente. Utiliser le resultat directement
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    char * ret_chaine_static_buff(int a)
    {
        static char buff[100];
        sprintf (buff, "Coucou %d", a);
        return buff;
    }
     
    static char private_buff[100];
    char * ret_chaine_static_global_buff(int a)
    {
        sprintf (private_buff, "Coucou %d", a);
        return private_buff;
    }
    * Laisser l'utilisateur de la fonction choisir où mettre la chaine. En general on donne la taille de la zone, pour eviter tout debordement. Ce genre de fonction peut aussi retourner un pointeur sur la zone passée (c'est ce que fait strcpy)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    char * set_chaine (int param, const char * param2, char * zone, size_t zone_size)
    {
       snprintf(zone, zone_size, "Coucou %d %s", param, param2);
       return zone;
    }

  4. #4
    Membre confirmé
    Inscrit en
    Février 2007
    Messages
    191
    Détails du profil
    Informations forums :
    Inscription : Février 2007
    Messages : 191
    Par défaut
    Dsl main je ne comprends pas bien ton code c un peu compliqué
    A part cette méthode il en n'existe pas d'autre un peu plus simple

    merci

  5. #5
    Membre Expert
    Avatar de Gruik
    Profil pro
    Développeur Web
    Inscrit en
    Juillet 2003
    Messages
    1 566
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Juillet 2003
    Messages : 1 566
    Par défaut
    Si : oublier les concepts de chaines des technologies comme Java, Php, VB... et raisonner avec des zones memoire

  6. #6
    Membre confirmé
    Inscrit en
    Février 2007
    Messages
    191
    Détails du profil
    Informations forums :
    Inscription : Février 2007
    Messages : 191
    Par défaut
    peux tu rentre plus ds le détail stp??

  7. #7
    Membre confirmé
    Inscrit en
    Février 2007
    Messages
    191
    Détails du profil
    Informations forums :
    Inscription : Février 2007
    Messages : 191
    Par défaut
    Je laisse mon petit bout de programme

    le parametre int j permet de choisir la ligne à lire et à recuperer du fichier.txt
    apres lecture la donnée et mise dans la chaine de caractere appeler chaine.
    C'est cette variable chaine que je voudrais renvoyer

    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
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
     
     
    /*******************************************************************************
     
     *  Fonction  : lecture_fichier_txt
     
     *  Utilité   : Lecture des données du fichier.txt et modifictaion des paramètres 
     
                    du récepteur MIMO via le programme init_attenuation
     
     *  Remarques : - Ici on utilise un buffer pour pouvoir lire la ligne du 
     
                      fichier.txt désiré.Cette ligne est modélisée par la variable j
     
                    - Fonction qui ne récupére que les chaîne de caractères
     
                       du fichier    
     
    ********************************************************************************/
     
     
     
     
     
    ??? int lecture_fichier_txt(int j)
     
    {
     
     FILE *fichier;
     
     int cpt = 0; // on initialise le compteur sur la premiere ligne
     
     char chaine[TAILLE_MAX]= ""; // On utilise une chaîne pour placer la data récuperer
     
     
     
     
     
     fichier = fopen("fichier_data.txt","r"); // Ouverture du fichier
     
     
     
      if (fichier != NULL) // Test d'ouverture
     
       {
     
       while (fgets(chaine, TAILLE_MAX, fichier) != NULL) // On fait une boucle while pour
     
        	 {                                       // chercher la ligne que l'on veut lire
     
     
     
              cpt=++cpt; // Attention ici on doit d'abord effectuer l'incrementation
     
               //printf("on va entrer ds la boucle if pour la %d fois\n",cpt);
     
               if(cpt==j) // Ici on choisit la ligne à récupérer     
     
                 printf("la chaine de caractere est donc %d\n",Valeur);
     
     
     
     
     
             }
     
       }
     
     else
     
     printf("Impossible d'ouvrir le fichier fichier_data.txt");
     
     
     
    ??? return chaine;
      system("PAUSE"); 
     
    }
    Merci

  8. #8
    Membre Expert
    Avatar de Gruik
    Profil pro
    Développeur Web
    Inscrit en
    Juillet 2003
    Messages
    1 566
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Juillet 2003
    Messages : 1 566
    Par défaut
    Et bien, une chaine en C, c'est juste le concept suivant : "une suite de caractere terminée par le caractère nul". Ce n'est pas une variable ou un objet comme dans les technologies citées plus haut.
    Si tu veux manipuler des chaines comme dans ces technologies, il va falloir que tu sois aware d'une chose : les caractères qui les constituent sont forcément stoqués dans une zone memoire contigue. Obtenir une telle zone memoire est faisable de plusieurs façons et le plus simple est le tableau de caractere en variable locale (couramment appelé buffer)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    int main(void)
    {
      char mon_buffer[100];
      strcpy(mon_buffer, "Une chaine");
      return 0;
    }

  9. #9
    Membre confirmé
    Inscrit en
    Février 2007
    Messages
    191
    Détails du profil
    Informations forums :
    Inscription : Février 2007
    Messages : 191
    Par défaut
    est -il possible d'avoir un réponse plus simple

    a savoir quelle methode j'utilise et comment je dois la coder car la j'ai plusieurs réponse avec des uns qui disent que ces pas bon d'autre que c'est bon

    je vous rappele ma fct si vous pouvez la changer pour que la fonction puisse recuperer la chaine svp car la je bloque vraiment

    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
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
     
    *******************************************************************************
     
     *  Fonction  : lecture_fichier_txt
     
     *  Utilité   : Lecture des données du fichier.txt et modifictaion des paramètres 
     
                    du récepteur MIMO via le programme init_attenuation
     
     *  Remarques : - Ici on utilise un buffer pour pouvoir lire la ligne du 
     
                      fichier.txt désiré.Cette ligne est modélisée par la variable j
     
                    - Fonction qui ne récupére que les chaîne de caractères
     
                       du fichier    
     
    ********************************************************************************/
     
     
     
     
     
    ??? int lecture_fichier_txt(int j)
     
    {
     
     FILE *fichier;
     
     int cpt = 0; // on initialise le compteur sur la premiere ligne
     
     char chaine[TAILLE_MAX]= ""; // On utilise une chaîne pour placer la data récuperer
     
     
     
     
     
     fichier = fopen("fichier_data.txt","r"); // Ouverture du fichier
     
     
     
      if (fichier != NULL) // Test d'ouverture
     
       {
     
       while (fgets(chaine, TAILLE_MAX, fichier) != NULL) // On fait une boucle while pour
     
        	 {                                       // chercher la ligne que l'on veut lire
     
     
     
              cpt=++cpt; // Attention ici on doit d'abord effectuer l'incrementation
     
               //printf("on va entrer ds la boucle if pour la %d fois\n",cpt);
     
               if(cpt==j) // Ici on choisit la ligne à récupérer     
     
                 printf("la chaine de caractere est donc %d\n",Valeur);
     
     
     
     
     
             }
     
       }
     
     else
     
     printf("Impossible d'ouvrir le fichier fichier_data.txt");
     
     
     
    ??? return chaine;
      system("PAUSE"); 
     
    }

  10. #10
    Expert confirmé
    Avatar de Thierry Chappuis
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Mai 2005
    Messages
    3 499
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : Suisse

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 499
    Par défaut
    Les propositions de Médinoc et de Gruik sont toutes bonnes. Celle que j'utilise de préférence se rapproche de celle-là:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    char * set_chaine (char *s_buffer, size_t buff_size, int param, const char * param2) 
    {  
        snprintf(s_buffer, buff_size, "Coucou %d %s", param, param2); 
     
        return s_buffer; 
    }
    Thierry
    "The most important thing in the kitchen is the waste paper basket and it needs to be centrally located.", Donald Knuth
    "If the only tool you have is a hammer, every problem looks like a nail.", probably Abraham Maslow

    FAQ-Python FAQ-C FAQ-C++

    +

  11. #11
    Membre confirmé
    Inscrit en
    Février 2007
    Messages
    191
    Détails du profil
    Informations forums :
    Inscription : Février 2007
    Messages : 191
    Par défaut
    j'ai compris thierry mais dslé je ne vois pas comment faire avec lma fonction car moi j'uitilise un fgets pour recuperer ma chaine et pour les parametres je mets koi??

    Peux tu stp jeter un oeil a mon code ci dessus et me faire le changement adequat

    Merci

  12. #12
    Membre confirmé
    Inscrit en
    Février 2007
    Messages
    191
    Détails du profil
    Informations forums :
    Inscription : Février 2007
    Messages : 191
    Par défaut
    une ptite réponse peut etre????

  13. #13
    Expert confirmé

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 610
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 610
    Billets dans le blog
    2
    Par défaut
    on t'a déjà répondu....

    En plus, on fera pas le boulot à ta place si tu fais pas plus d'efforts..

    En particulier, relire les cours ou tutoriels ferait pas de mal :

    http://nicolasj.developpez.com/articles/libc/string/

    En enfin, on sait pas ce que tu veux faire exactement:

    tu parles de ressortir une chaîne, mais tu lis tout le fichier....

  14. #14
    Expert éminent
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 644
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 644
    Par défaut
    Citation Envoyé par insa59
    une ptite réponse peut etre????
    Eh, Ho, on n'est pas à la piece!!!

    Alors, si tu veux une réponse, commence peut etre par répondre à ceci:
    • MAX_CHAR, ca vient d'où (comment c'est déclaré)
    • le parametre int j passé à ta fonction, il représente quoi au juste
    • Le but (à moins que je n'ai pas compris le sens du sujet) n'est-il pas de faire une fonction qui renvoie une chaine de caractères si oui, pourquoi renvoyer... un entier
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

Discussions similaires

  1. Réponses: 4
    Dernier message: 18/12/2014, 15h16
  2. Ma DLL retourne une chaine de caractère vide.
    Par alain8550 dans le forum ASP.NET
    Réponses: 2
    Dernier message: 31/01/2010, 16h28
  3. retourner un nombre pour une chaine de caractère
    Par cotede2 dans le forum Langage SQL
    Réponses: 4
    Dernier message: 17/06/2008, 13h26
  4. 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
  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