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 chaîne de caractères


Sujet :

C

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Ingénieur après-vente
    Inscrit en
    Novembre 2014
    Messages
    367
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Ingénieur après-vente

    Informations forums :
    Inscription : Novembre 2014
    Messages : 367
    Points : 9
    Points
    9
    Par défaut Retourner une chaîne de caractères
    Bonjour,

    Est-ce que quelqu'un saurait m'expliquer pour quelle raison cette fonction ne retourne pas le mot contenu dans le pointeur "*nomFich" :

    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
    char *lectureFichier(){
    	FILE *fich;
    	char ligne[LGL];
    	char nomFichier[LGL];
    	char *nomFich; // pointeur permettant de retourner le nom du fichier
    	nomFich = ligne;
    	printf("Nom du fichier a lire : ");
    	fgets(ligne, LGL, stdin);
    	sscanf(ligne, "%s", nomFichier);
    	fich = fopen(nomFichier, "r");
    	if (fich == NULL){
    		printf("Ouverture impossible fichier %s\n", nomFichier);
    	}
    	else{
    		printf("Fichier %s \n", nomFichier);
    		fgets(ligne, LGL, fich); // Lecture 1ère ligne
    		while (!feof(fich)) { // Tant que non fin de fichier
    			printf("%s", ligne); // Imprimer ligne à l’écran
    			fgets(ligne, LGL, fich); // Lecture ligne suivante
    		}
    		fclose(fich);
    	}
    	printf("Contenu de nomFich : ");
    	puts(nomFich);
    	return nomFich;
    }

    Merci pour votre aide.

  2. #2
    Invité
    Invité(e)
    Par défaut
    Car nomFich est une variable local, et que ce qui est local, reste local ?

  3. #3
    Futur Membre du Club
    Homme Profil pro
    Ingénieur après-vente
    Inscrit en
    Novembre 2014
    Messages
    367
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Ingénieur après-vente

    Informations forums :
    Inscription : Novembre 2014
    Messages : 367
    Points : 9
    Points
    9
    Par défaut
    mais le propre d'une fonction n'est-il pas d'affecter le contenu retourné d'une variable locale à une variable du "main" ?

  4. #4
    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
    Oui ...

    ... mais nomFich contient l'adresse du premier élément du tableau local ligne et c'est donc cette adresse qui est retournée. Comme les objets locaux sont détruits en sortie de la fonction, ce tableau est détruit et tu stockes alors l'adresse de quelque chose qui n'existe plus.

    Moralité : On ne doit jamais retourner, de quelque façon que ce soit, l'adresse d'un objet local.
    Publication : Concepts en C

    Mon avatar : Glenn Gould

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

  5. #5
    Futur Membre du Club
    Homme Profil pro
    Ingénieur après-vente
    Inscrit en
    Novembre 2014
    Messages
    367
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Ingénieur après-vente

    Informations forums :
    Inscription : Novembre 2014
    Messages : 367
    Points : 9
    Points
    9
    Par défaut
    Est-ce qu'avec un void qui par définition ne retourne rien je peux contourner le problème ?

  6. #6
    Nouveau membre du Club
    Homme Profil pro
    plombier
    Inscrit en
    Décembre 2012
    Messages
    31
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : plombier
    Secteur : Bâtiment

    Informations forums :
    Inscription : Décembre 2012
    Messages : 31
    Points : 25
    Points
    25
    Par défaut
    Bonjour, pour éviter ce problème alloue dynamiquement nomFichier

  7. #7
    Futur Membre du Club
    Homme Profil pro
    Ingénieur après-vente
    Inscrit en
    Novembre 2014
    Messages
    367
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Ingénieur après-vente

    Informations forums :
    Inscription : Novembre 2014
    Messages : 367
    Points : 9
    Points
    9
    Par défaut
    Citation Envoyé par Dev 37C Voir le message
    Bonjour, pour éviter ce problème alloue dynamiquement nomFichier


    Allouer dynamiquement comme ici par exemple ?


    Nom : char.png
Affichages : 100
Taille : 31,7 Ko

  8. #8
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 690
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 690
    Points : 30 986
    Points
    30 986
    Billets dans le blog
    1
    Par défaut
    Bonjour

    Tu devrais écrire encore plus gros.

    Donc oui, écrit ainsi (renvoyer une adresse allouée via malloc) ça fonctionne. Charge alors à l'appelant de libérer la mémoire allouée une fois qu'il n'en aura plus besoin. Mais tu peux remplacer malloc+strcpy par strdup qui fait exactement le même travail.

    Ce qui ne fonctionne pas, en revanche, c'est ta méthode pour enlever le '\n' car rien ne te garantit qu'il y en a un. Et si ce n'est pas le cas, tu enlèves alors un caractère utile de ta chaine.

    Code c : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    // Enlever '\n'
    char *pt;
    if ((pt=strchr(ligne, '\n')) != NULL) *pt='\0';

    Citation Envoyé par wallace27 Voir le message
    Est-ce qu'avec un void qui par définition ne retourne rien je peux contourner le problème ?
    Tout à fait. Puisqu'un void ne retourne rien, aucun risque alors de retourner l'adresse d'une variable locale. Ainsi tu n'as plus de problème (ni de solution non plus d'ailleurs).

    Citation Envoyé par wallace27 Voir le message
    Code c : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    fgets(ligne, LGL, fich); // Lecture 1ère ligne
    while (!feof(fich)) { // Tant que non fin de fichier
    	printf("%s", ligne); // Imprimer ligne à l’écran
    	fgets(ligne, LGL, fich); // Lecture ligne suivante
    }
    Ca fonctionne mais il y a plus simple
    Code c : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    while (fgets(ligne, LGL, fich) != NULL)
    	printf("%s", ligne);
    Hé oui, puisque fgets() lit et aussi indique si la lecture a pu se faire, alors autant s'en servir...
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  9. #9
    Expert éminent sénior

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 189
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

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

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 189
    Points : 17 141
    Points
    17 141
    Par défaut
    En fait, while (feof()) ne fonctionne pas vraiment.
    feof() indique si la dernière erreur était une fin de fichier, alors qu'il y a d'autre causes d'erreur.

    Par contre, la bonne solution est bien celle que tu as proposée: tester la valeur de retour de la fonction de lecture.
    Mes principes de bases du codeur qui veut pouvoir dormir:
    • Une variable de moins est une source d'erreur en moins.
    • Un pointeur de moins est une montagne d'erreurs en moins.
    • Un copier-coller, ça doit se justifier... Deux, c'est un de trop.
    • jamais signifie "sauf si j'ai passé trois jours à prouver que je peux".
    • La plus sotte des questions est celle qu'on ne pose pas.
    Pour faire des graphes, essayez yEd.
    le ter nel est le titre porté par un de mes personnages de jeu de rôle

Discussions similaires

  1. Réponses: 8
    Dernier message: 12/02/2013, 01h08
  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
  5. Réponses: 3
    Dernier message: 09/05/2002, 01h39

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