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 :

Petit probleme avec une fonction qui utilise les char


Sujet :

C

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 14
    Points : 14
    Points
    14
    Par défaut Petit probleme avec une fonction qui utilise les char
    Bonjour a tous,
    J'ai fait une fonction decoupage qui decoupe les char avec les espaces.
    le truc c'est que je n'arrive pas a men servier correctement. J'ai une segmentation fault. et la je voie pas.
    les 2 premiers printf m'affiche bien les caractéres mais quand je me sert de ma fonction ca marche pas!!!
    Si vous avez une idée je suis preneur.
    Merci

    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
     
    char decoupage(char mess[80], char action[80]){
     
    	char mess2[80];
     
    	char *result = NULL;
     
    	result = strtok( mess, " ");
     
    	while( result != NULL )
     
    	{
     
    		if(strcmp(result,action)!=0)
     
    		{
     
    			strcpy(mess2,result);
     
    		}
     
    		result = strtok( NULL, " ");
     
    	}
     
    	return mess2;
     
    }
     
     
    int main (){
    	char mess[80];char action[80];	
    	strcpy(mess,"RETR client.c");strcpy(action,"RETR");
    	printf("Mess : %s\n",mess);
    	printf("Action : %s\n",action);
    	char test2 = decoupage((char *)mess,(char *)action);
    	printf("Fichier : %s\n",test2);
    }

  2. #2
    Expert éminent sénior
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Points : 13 926
    Points
    13 926
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    char decoupage(char mess[80], char action[80]){
    	char mess2[80];
     ...
    	return mess2; 
    }
    La fonction retourne mess2 qui est l'adresse du premier élément du tableau (donc du type char*). Or le prototype indique un char. Le compilateur a du râler !

    La correction de cette erreur est donc d'écrire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    char * decoupage(char mess[80], char action[80]){
    MAIS, tes ennuis ne sont pas terminés :
    mess2 est l'adresse d'une variable locale à la fonction. En sortant de la fonction, les variables locales sont détruites et tu renvoies alors l'adresse de quelque chose qui n'existera plus -> plantage.

    Solutions possibles :
    - faire de l'allocation dynamique pour le tableau mess2 ;
    - mettre mess2 en variable globale (mais comme les variables globales sont à proscrire sauf absolue nécessité, tu rejeteras cette solution)
    - créer le tableau mess2 en dehors de la fonction (ici dans main) pour le passer en argument de la fonction.


    Remarques :
    - dans
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    decoupage((char *)mess,(char *)action);
    les casts (char*) sont parfaitement inutiles, ici mess et action sont déjà des char *

    - Il faut être conscient que les 80 ne servent à rien ici, le compilateur s'en fiche, et qu'on peut les omettre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    char decoupage(char mess[80], char action[80]){
    et écrire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    char decoupage(char mess[], char action[]){....
    // ou ce qui est équivalent :
    char decoupage(char * mess, char * action){
    Publication : Concepts en C

    Mon avatar : Glenn Gould

    --------------------------------------------------------------------------
    Une réponse vous a été utile ? Remerciez son auteur en cliquant le pouce vert !

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 14
    Points : 14
    Points
    14
    Par défaut Merci
    Merci bcp,
    Bon j'ai reussi a la compilé sans erreur juste quelque warning

    le main :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    int main (){
    	char mess[80];char action[80];	
    	strcpy(mess,"RETR client.c");strcpy(action,"RETR");
    	printf("Mess : %s\n",mess);
    	printf("Action : %s\n",action);
    	printf("Fichier1 : %s\n",mess);
    	char *test2 = decoupage(mess,action);
    	printf("Fichier : %s\n",test2);
    }
    La fonction :
    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
     
    char *decoupage(char mess[80], char action[80]){
     
    	char mess2[80];
     
    	char *result = NULL;
     
    	result = strtok( mess, " ");
     
    	while( result != NULL )
     
    	{
     
    		if(strcmp(result,action)!=0)
     
    		{
     
    			strcpy(mess2,result);
     
    		}
     
    		result = strtok( NULL, " ");
     
    	}
     
    	return mess2;
     
    }
    je l'utilise dans uns fonction un petit peu plus longue... je n'est pas de souci avec le retour. j'arrive a recupere mon mess2 sans souci.
    Je pense pas que ce soit optimisé mais bon... Ca marche
    Merci pour l'aide.

  4. #4
    Membre à l'essai
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 14
    Points : 14
    Points
    14
    Par défaut le warning
    Voila le warning:
    test.c: In function ‘decoupage’:
    test.c:31: warning: function returns address of local variable

    le truc que je ne comprend pas c'est que j'utilise bien une variable locale comme indiqué dans le warning. Mais je ne comprend pas alors pourquoi le prog fonctionne bien. Il me retourne bien ce que je lui demande... Si tu as une explications je suis preneur.
    Merci pour ton aide

  5. #5
    Expert éminent sénior
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Points : 13 926
    Points
    13 926
    Par défaut
    Je t'ai dit dans mon message précédent :
    MAIS, tes ennuis ne sont pas terminés :
    mess2 est l'adresse d'une variable locale à la fonction. En sortant de la fonction, les variables locales sont détruites et tu renvoies alors l'adresse de quelque chose qui n'existera plus -> plantage.
    Ton compilateur, qui n'est pas bête, s'en est aperçu et te le signale comme avertissement. C'est parce que c'est un tendre et qu'il ne veut pas te faire de peine : ce genre de choses est toujours une erreur grave.

    Si ton programme ne s'est pas planté c'est par pur hasard. C'est parce que la mémoire utilisée temporairement par la variable locale n'avait pas encore été utilisée pour autre chose mais elle peut l'être à tout moment.

    Il faut absolument corriger ça !

    Toujours extrait de mon message précédent :
    Solutions possibles :
    - faire de l'allocation dynamique pour le tableau mess2 ;
    - mettre mess2 en variable globale (mais comme les variables globales sont à proscrire sauf absolue nécessité, tu rejeteras cette solution)
    - créer le tableau mess2 en dehors de la fonction (ici dans main) pour le passer en argument de la fonction.
    Publication : Concepts en C

    Mon avatar : Glenn Gould

    --------------------------------------------------------------------------
    Une réponse vous a été utile ? Remerciez son auteur en cliquant le pouce vert !

Discussions similaires

  1. Réponses: 1
    Dernier message: 11/12/2013, 22h17
  2. Petit probleme avec une class pour les bbcode
    Par chrisl0 dans le forum Langage
    Réponses: 5
    Dernier message: 26/04/2012, 15h29
  3. [MySQL] probleme avec une fonction qui retaille mes images
    Par mademoizel dans le forum PHP & Base de données
    Réponses: 7
    Dernier message: 01/02/2011, 21h26
  4. Réponses: 5
    Dernier message: 25/09/2006, 11h06
  5. [LG]Probleme avec une fonction
    Par xavier1936 dans le forum Langage
    Réponses: 7
    Dernier message: 08/02/2005, 22h48

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