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 :

[débutant] Lecture d'une chaine de caractère


Sujet :

C

  1. #1
    Membre habitué Avatar de Emplyst
    Inscrit en
    Mars 2006
    Messages
    152
    Détails du profil
    Informations forums :
    Inscription : Mars 2006
    Messages : 152
    Points : 148
    Points
    148
    Par défaut [débutant] Lecture d'une chaine de caractère
    Tout d'abord joyeux noël pour ceux qui le fête, pour les autres bien... joyeux 25 décembre!

    Je débute, alors si vous avez quelques conseils, outre ceux en relation avec ma problèmatique, ne vous gênez pas.

    Voilà j'essais de lire une chaine de caractère d'une taille dynamique. Donc pour se faire je me suis fait une fonction joliment nomméegetstr et lorsque je récupaire la chaine tout se passe bien. Parcontre avec le débugger de C-Free (exellent éditeur) j'ai remarqué qu'en dehors de getstr la variable redevient à sa valeur initiale (c-a-d rien, null, 0x0).

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    main.h
    #include <stdio.h>
    #include "string.h"
    
    int main(int argc, char** argv);
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    main.c
    #include "main.h"
    
    int main(int argc, char** argv)
    {
        char* str;
    	
        getstr(str);
        printf("\t\"%s\"\n", str);
    
        return 0;
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    string.h
    #include <stdlib.h>
    
    unsigned int strlen(const char* str);
    unsigned int getstr(char* str);
    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
    string.c
    #include "string.h"
    
    unsigned int strlen(const char* str)
    {
    	unsigned int i;
    
    	i = 0;
    	
    	while (str[i] != '\0')
    	{
    		i++;
    	}
    
    	return i;
    }
    
    unsigned int getstr(char* str)
    {
    	unsigned int i;
    	char c;
    
    	i = 0;
    	str = malloc(sizeof(char));
    	
    	while ((c = getchar()) != '\n')
    	{
    		str[i++] = c;
    		str = realloc(str, ((i + 1) * sizeof(char)));		
    	}
    	str[i] = '\0';
    	
    	return i;
    }
    Bref je suis un peut perdu, merci d'avance à ceux qui pourrons m'éclairer de leur savoir .

  2. #2
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 381
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 381
    Points : 41 581
    Points
    41 581
    Par défaut
    1. string.h est un nom réservé, je te déconseille de l'utiliser.
    2. Les paramètres d'une fonction sont des variables locales, donc soit tu passes un buffer pré-alloué (ainsi que sa taille) à la fonction, soit tu lui passes l'adresse d'un pointeur sur char. Sachant qu'ici, seule la seconde solution est viable, puisque le buffer est ré"lloué dynamiquement.
    3. Ton utilisation de realloc() est incorrecte. Tu dois passer par une variable temporaire en cas d'échec de realloc() (car si realloc() échoue, str est toujours un pointeur valide).

  3. #3
    Membre habitué Avatar de Emplyst
    Inscrit en
    Mars 2006
    Messages
    152
    Détails du profil
    Informations forums :
    Inscription : Mars 2006
    Messages : 152
    Points : 148
    Points
    148
    Par défaut
    J'ai résolu le problème d'un façon indirecte. C-a-d que le propotype a changé.

    getstr ressemble dorénavent à ça:
    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
     
    char* getstr(void)
    {
    	unsigned int i;
    	char* buffer;
    	char c;
     
    	i = 0;
    	buffer = malloc(sizeof(char));
     
    	while ((c = getchar()) != '\n')
    	{
    		buffer[i++] = c;
    		buffer = realloc(buffer, ((i + 1) * sizeof(char)));		
    	}
    	buffer[i] = '\0';
     
    	return buffer;
    }

  4. #4
    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 : 47
    Localisation : Suisse

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

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 499
    Points : 5 360
    Points
    5 360
    Par défaut
    Salut,

    Il n'est pas utile d'inclure un fichier d'en-tête main.h contenant le prototype de la fonction main et tu peux inclure stdio.h directement dans main.

    string.h est effectivement, comme l'a précisé Médinoc, un fichier d'en-tête de la bibliothèque standard du langage C. C'est un des noms réservé du langages. De la même manière, tous les noms de fonctions qui commencent par "str" sont réservés.

    Thierry

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

Discussions similaires

  1. lecture d'une chaine de caractére
    Par oliv27400 dans le forum MATLAB
    Réponses: 4
    Dernier message: 01/06/2010, 09h29
  2. lecture d'une chaine de caractères
    Par freestyler dans le forum C#
    Réponses: 2
    Dernier message: 01/03/2007, 17h20
  3. Réponses: 9
    Dernier message: 19/10/2006, 17h02
  4. Lecture d'une chaine de caractère avec fgets
    Par mayoouketchup dans le forum Langage
    Réponses: 9
    Dernier message: 22/12/2005, 16h17
  5. [Débutant]Encodage d'une chaine de caractères
    Par Crazyblinkgirl dans le forum Entrée/Sortie
    Réponses: 3
    Dernier message: 03/08/2004, 16h47

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