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 :

Allocation d' une chaine juste à la bonne taille


Sujet :

C

  1. #1
    Membre habitué Avatar de emprex
    Homme Profil pro
    auto-entrepreneur
    Inscrit en
    Octobre 2007
    Messages
    219
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : auto-entrepreneur
    Secteur : Services à domicile

    Informations forums :
    Inscription : Octobre 2007
    Messages : 219
    Points : 199
    Points
    199
    Par défaut Allocation d' une chaine juste à la bonne taille
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    char* SaisieChaine(void){
    	char chaine[1000];
    	char *econome;
    	puts("Saisir une ligne");
    	fgets(chaine, 1000, stdin);
    	econome = (char *)calloc((strlen(chaine)+1)*sizeof(char));
    	strcpy(econome, chaine);
    	return econome;
    }
    bonjour, j'ai cette petite fonction qui doit allouer juste assez de place en mémoire pour un chaîne saisie au clavier. Le probleme est que mon compilateur m'explique qu'il y à trop peu de paramètre pour calloc. j' ai donc tenté avec malloc, et ca marche. Je voulais donc savoir si il faut, dans le cas d'une chaîne, initialiser la place reservée à zéro ou si l'adresse du premier octet était suffissante.Je vous pose cette question car j'ai trouvé la fonction dans mon livre de C et je veux comprendre ou se trouve l'erreur.
    Merci.
    je l'ai transformée comme cela
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    char* SaisieChaine(void){
    	char chaine[1000];
    	char *econome;
    	puts("Saisir une ligne");
    	fgets(chaine, 1000, stdin);
    	econome = (char *)calloc((strlen(chaine)+1),sizeof(char));
    	strcpy(econome, chaine);
    	return econome;
    }
    Ceci est-il juste?

  2. #2
    Modérateur
    Avatar de ToTo13
    Homme Profil pro
    Chercheur en informatique
    Inscrit en
    Janvier 2006
    Messages
    5 793
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Chercheur en informatique
    Secteur : Santé

    Informations forums :
    Inscription : Janvier 2006
    Messages : 5 793
    Points : 9 860
    Points
    9 860
    Par défaut
    Bonjour,

    si tu lis le man ("man calloc"), tu t'appercevra que la fonction ne s'utilise pas exactement comme malloc et qu'il faut lui passer deux arguments.

  3. #3
    Rédacteur
    Avatar de Vincent Rogier
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    2 373
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 2 373
    Points : 5 306
    Points
    5 306
    Par défaut
    calloc() alloue la mémoire et l'initialise.

    En gros (dans la théorie), calloc() = malloc() + memset()

  4. #4
    Membre éclairé Avatar de valefor
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    711
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 711
    Points : 790
    Points
    790
    Par défaut
    En général, les focntions str* s'occupent de te retourner des chaines (donc un tableau d'octet fini par zero). Il n'est donc pas toujours nécéssaire d'initialiser ton tableau d'octets.

    En réponse je dirais donc qu'il faut regarder la page de man de strcpy.

  5. #5
    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
    Voici le prototype de calloc():

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    void * calloc (size_t nmemb, size_t size);
    Le 2e paramètre est la taille d'un bloc et le 1er représente le nombre de blocs à allouer. L'initialisation se fait "All bytes to zero". Pas terrible comme technique d'initialisation (du moins pour un tableau de pointeurs ou un tableau de double).

    Thierry

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

Discussions similaires

  1. [PowerShell] Récuperer le contenu d'une chaine de caracteres de taille variable
    Par Parkiro69 dans le forum Scripts/Batch
    Réponses: 2
    Dernier message: 20/02/2014, 10h01
  2. Taille d'une chaine
    Par LDDL dans le forum Langage
    Réponses: 6
    Dernier message: 15/07/2006, 13h17
  3. Taille d'une chaine en pixels...
    Par zoubidaman dans le forum C++Builder
    Réponses: 4
    Dernier message: 13/07/2004, 11h58
  4. Taille d'une chaine
    Par smash31 dans le forum AWT/Swing
    Réponses: 3
    Dernier message: 13/07/2004, 11h46
  5. Réponses: 10
    Dernier message: 22/05/2004, 14h51

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