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 :

comment récupérer une chaîne de caractères


Sujet :

C

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2008
    Messages
    32
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Avril 2008
    Messages : 32
    Points : 27
    Points
    27
    Par défaut comment récupérer une chaîne de caractères
    Bonjour,
    je souhaite recuperer une chaine de caractère qui est modifier dans une fonction
    voila un exemple de ce que je veux faire :
    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
     
    void fct(char *reponse,int max_rep)
    {
     
      reponse=malloc(max_rep*sizeof(char));
      reponse="la chaine de retour";
      printf("reponse = %s\n",reponse);
     
    }
     
    int main()
    {
      char *chaine;
      fct(chaine,30);
      printf("chaine=%s\n",chaine);
      free(chaine);
      return 0;
     
    }
    mon probleme c'est que ce la ne marche pas !!

    Merci d'avance

  2. #2
    Membre expérimenté Avatar de BainE
    Inscrit en
    Mai 2004
    Messages
    1 327
    Détails du profil
    Informations forums :
    Inscription : Mai 2004
    Messages : 1 327
    Points : 1 544
    Points
    1 544
    Par défaut
    bonjour,

    tu es obligé de passé par un pointeur de pointeur sur ta reponse sinon la recopie de parametre en sortie de fonction ecrase ton adresse allouée.

    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
     
     
    void fct(char **reponse,int max_rep)
    {
     
      *reponse=malloc(max_rep*sizeof(char));
      *reponse="la chaine de retour";
      printf("reponse = %s\n",*reponse);
     
    }
     
    int main()
    {
      char *chaine;
      fct(&chaine,30);
      printf("chaine=%s\n",chaine);
      free(chaine);
      return 0;
     
    }
    ce code doit fonctionner
    "vaste programme"

  3. #3
    Membre confirmé Avatar de KindPlayer
    Profil pro
    Inscrit en
    Février 2007
    Messages
    471
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 471
    Points : 477
    Points
    477
    Par défaut et ca renvoie quoi a l'execution
    je suis pas un pro du C, mais ce que tu as écrit dans ta fonction je le sens pas trop. Deja ca sert a rien d'allouer avec malloc pour ecrire apres chaine="...".
    De plus il est deconseille de modifié une chaine déclarée comme pointeur sur char. Utilise plutot un tableau de char.
    Comment veux tu modifier ta chaine? Je suis pas sur de bien comprendre ce que tu veux faire.
    Va faire un petit tour ici:https://www.securecoding.cert.org/co...ings+%28STR%29
    La science est ce que nous comprenons suffisamment bien pour l'expliquer à un ordinateur. L'art, c'est tout ce que nous faisons d'autre.
    Donald E. Knuth

  4. #4
    Nouveau membre du Club
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2008
    Messages
    32
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Avril 2008
    Messages : 32
    Points : 27
    Points
    27
    Par défaut
    merci c'est bien ca sauf que maintenant j'ai un autre probleme

    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
     
    reponse = la chaine de retour
    chaine=la chaine de retour
    *** glibc detected *** ./exeT: free(): invalid pointer: 0x0000000000400678 ***
    ======= Backtrace: =========
    /lib64/libc.so.6[0x2af37f7f0f9a]
    /lib64/libc.so.6(cfree+0x8c)[0x2af37f7f4c1c]
    ./exeT[0x400581]
    /lib64/libc.so.6(__libc_start_main+0xf4)[0x2af37f79fae4]
    ./exeT[0x400479]
    ======= Memory map: ========
    00400000-00401000 r-xp 00000000 00:16 10256923                           /home/Documents/exeT
    00600000-00601000 rw-p 00000000 00:16 10256923                           /home/Documents/exeT
    00601000-00622000 rw-p 00601000 00:00 0                                  [heap]
    2af37f567000-2af37f581000 r-xp 00000000 08:01 868572                     /lib64/ld-2.6.1.so
    2af37f581000-2af37f583000 rw-p 2af37f581000 00:00 0
    2af37f5a3000-2af37f5a4000 rw-p 2af37f5a3000 00:00 0
    2af37f780000-2af37f781000 r--p 00019000 08:01 868572                     /lib64/ld-2.6.1.so
    2af37f781000-2af37f782000 rw-p 0001a000 08:01 868572                     /lib64/ld-2.6.1.so
    2af37f782000-2af37f8c8000 r-xp 00000000 08:01 868360                     /lib64/libc-2.6.1.so
    2af37f8c8000-2af37fac7000 ---p 00146000 08:01 868360                     /lib64/libc-2.6.1.so
    2af37fac7000-2af37faca000 r--p 00145000 08:01 868360                     /lib64/libc-2.6.1.so
    2af37faca000-2af37facc000 rw-p 00148000 08:01 868360                     /lib64/libc-2.6.1.so
    2af37facc000-2af37fad2000 rw-p 2af37facc000 00:00 0
    2af37fad2000-2af37fadf000 r-xp 00000000 08:01 868375                     /lib64/libgcc_s-4.2.2.so.1
    2af37fadf000-2af37fcde000 ---p 0000d000 08:01 868375                     /lib64/libgcc_s-4.2.2.so.1
    2af37fcde000-2af37fcdf000 rw-p 0000c000 08:01 868375                     /lib64/libgcc_s-4.2.2.so.1
    2af380000000-2af380021000 rw-p 2af380000000 00:00 0
    2af380021000-2af384000000 ---p 2af380021000 00:00 0
    7fff2b52d000-7fff2b543000 rw-p 7fff2b52d000 00:00 0                      [stack]
    ffffffffff600000-ffffffffff601000 r-xp 00000000 00:00 0                  [vdso]
    Abort
    qu'est ce que cela veut dire !! :s

    Merci d'avance !!

  5. #5
    Membre éprouvé Avatar de orfix
    Homme Profil pro
    Inscrit en
    Avril 2007
    Messages
    707
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Avril 2007
    Messages : 707
    Points : 1 132
    Points
    1 132
    Par défaut
    Salut,

    Quelques remarques :
    • Toujours vérifier les retours de malloc
    • Pour manipuler des chaînes de caractères on utilise généralement les fonctions standard dont les prototypes se trouvent dans 'string.h'
    • Ta fonction devrais fournir une réponse OUI/NON selon quelle est réussi à faire son travail ou pas pour qu'on puisse libérer la mémoire utilisée
    • Les paramètres sont toujours passés par valeur aux fonctions pour les modifier il faut passer leurs adresses


    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
     
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
     
    int fct(char **reponse,int max_rep)
    {
    	int ret=1;
     
    	if( max_rep>0 )
    	{
    		if( (*reponse = malloc( max_rep )) )
    		{
    			*reponse[0] = '\0';
    			strncat(*reponse,"la chaine de retour",max_rep-1);
    			ret = 1; /* OK */
    		}
    		else
    		{
    			ret = 0; /* KO */
    		}
    	}
    	return ret;
    }
     
    int main( void )
    {
    	char *chaine;
     
    	if( fct(&chaine,30) )
    	{
    		printf("chaine=%s\n",chaine);
    		free(chaine);
    	}
    	else
    	{
    		/* Traitement en cas d'erreur ... */
    	}
    	return 0;
    }
    @++
    To start press any key. (reading screen) Where's the "any" key? I see Esc, Catarl, and Pig Up. There doesn't seem to be any "any" key. Wo! All this computer hacking is making me thirsty. I think I'll order a Tab. (presses TAB key). -- HOMER --

  6. #6
    Nouveau membre du Club
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2008
    Messages
    32
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Avril 2008
    Messages : 32
    Points : 27
    Points
    27
    Par défaut
    merci !
    cela a l'air de marcher !! :d mais ce que je ne comprend pas pourquoi tu met
    merci d'avance !!

  7. #7
    Membre expérimenté Avatar de BainE
    Inscrit en
    Mai 2004
    Messages
    1 327
    Détails du profil
    Informations forums :
    Inscription : Mai 2004
    Messages : 1 327
    Points : 1 544
    Points
    1 544
    Par défaut
    le '\0' c'est le marqueur de fin de chaine.
    Pour l instant ta chaine est vide donc tu set le premier caractere avec ce marqueur.
    Je sais plus si c'est obligatoire, faudrait aller voir le man pour etre sur, mais la dons le doue tu sera sur que ca marche
    "vaste programme"

  8. #8
    Nouveau membre du Club
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2008
    Messages
    32
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Avril 2008
    Messages : 32
    Points : 27
    Points
    27
    Par défaut
    c'est bon merci bcp !!

  9. #9
    Membre éprouvé Avatar de orfix
    Homme Profil pro
    Inscrit en
    Avril 2007
    Messages
    707
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Avril 2007
    Messages : 707
    Points : 1 132
    Points
    1 132
    Par défaut
    Citation Envoyé par BainE Voir le message
    le '\0' c'est le marqueur de fin de chaine.
    Pour l instant ta chaine est vide donc tu set le premier caractere avec ce marqueur.
    Je sais plus si c'est obligatoire, faudrait aller voir le man pour etre sur, mais la dons le doue tu sera sur que ca marche
    Dans ce cas c'est obligatoire ! Je vous renvoie à cette discussion très intéressante :
    http://www.developpez.net/forums/sho...d.php?t=577701
    To start press any key. (reading screen) Where's the "any" key? I see Esc, Catarl, and Pig Up. There doesn't seem to be any "any" key. Wo! All this computer hacking is making me thirsty. I think I'll order a Tab. (presses TAB key). -- HOMER --

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

Discussions similaires

  1. Réponses: 0
    Dernier message: 07/01/2011, 09h44
  2. Réponses: 3
    Dernier message: 03/11/2009, 07h19
  3. Comment découper une chaîne de caractères en VBA
    Par TomPad dans le forum Access
    Réponses: 3
    Dernier message: 23/06/2005, 09h58
  4. Réponses: 5
    Dernier message: 15/02/2005, 18h07
  5. lpici.lpverb comment récupérer la chaîne de caractère ? Help
    Par Frenchbeast dans le forum API, COM et SDKs
    Réponses: 9
    Dernier message: 26/07/2004, 15h53

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