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 :

calloc + strcpy


Sujet :

C

  1. #1
    Membre confirmé
    Inscrit en
    Avril 2007
    Messages
    82
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 82
    Par défaut calloc + strcpy
    Bonjour ,

    J'ai un problème au niveau du calloc et du strcpy, un warning qui semble pouvoir être contourner avec un cast foireux , mais j'ai bien peur que ce ne soit pas la solution
    A ce que j'ai compris , calloc alloue un pointeur vers un tableau en mémoire , je me trompe ?

    Dans le code qui suit, je ne fais aucune vérification sur le retour des fonctions, c'est juste à titre d'exemple pour le calloc :

    voici l'erreur : warning: passing argument 1 of ‘strcpy’ makes pointer from integer without a cast

    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
     
     
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
     
    char* split(char * );
    int main()
    {
    	int i;
    	char buff[100] = "azerty.qsdfg.wxcvb";
    	char * p = split(&buff[0]);
    	for(i=0;i<3;i++)
    		printf("%s\n",p[i]);
    	free(p);
    	return 0;
     
    }
    char* split(char *buff)
    {
    	int i = 0;
    	char *chaine = (char*) calloc(3,sizeof(char)*20);
    	char *pseek = strtok(buff,".");
    	while( pseek!= NULL )
    	{
    		strcpy(chaine[i++],pseek);
    		pseek = strtok(NULL,".");
    	}
    	return chaine;
     
    }
    Merci d'avance de votre aide

  2. #2
    Membre émérite Avatar de crocodilex
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    697
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 697
    Par défaut
    strcpy() attend une chaine de caractère en premier argument, alors que toi tu lui passes un caractère....c'est pas cool....

  3. #3
    Membre confirmé
    Inscrit en
    Avril 2007
    Messages
    82
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 82
    Par défaut
    Ok donc j'ai mal compris le calloc ...
    Comment accède-ton au premier élément du tableau ?

  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 : 48
    Localisation : Suisse

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

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 499
    Par défaut
    Voici ton code avec quelques modifs:

    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
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
     
    #define SPLIT_SIZE 20
     
    char ** split(char *buff, size_t *n_splits);
    void split_delete(char ***ppp);
     
    int main(void)
    {
        size_t i;
        char buff[100] = "azerty.qsdfg.wxcvb";
        size_t n_splits = 0;
        char ** pp = split(buff, &n_splits);
     
        for (i = 0; i < n_splits; i++)
        {
            printf("%s\n", pp[i]);
        }
     
        split_delete(&pp);
        return 0;
     
    }
    char** split(char *buff, size_t *n_splits)
    {
        char **chaines = NULL;
     
        /* -tc- vaidation des parametres */
        if (buff != NULL && n_splits != NULL)
        {
            size_t i = 0;
            size_t n = 1;
     
            for (i = 0; buff[i] != '\0'; i++)
            {
                if (buff[i] == '.')
                {
                    n++;
                }
            }
     
            chaines = malloc(n * sizeof *chaines);
            if (chaines != NULL)
            {
                chaines[0] = malloc(n * sizeof *chaines[0] * SPLIT_SIZE);
                if (chaines[0] != NULL)
                {
                    char *pseek = NULL;
     
                    for (i = 1; i < n; i++)
                    {
                        chaines[i] = &chaines[0][i * SPLIT_SIZE];
                    }
     
                    pseek = strtok(buff, ".");
                    i = 0;
     
                    while (pseek != NULL)
                    {
                        chaines[i][0] = '\0';
                        strncat(chaines[i], pseek, SPLIT_SIZE - 1);
                        ++i;
                        pseek = strtok(NULL,".");
                    }
     
                    /* -tc- retour du nombre de splits */
                    *n_splits = n;
                }
                else
                {
                    /* -tc- Erreur d'allocation: on fait le menage! */
                    free(chaines), chaines = NULL;
                }
            }
        }
     
        return chaines;
    }
     
    void split_delete(char ***ppp)
    {
        if (ppp != NULL && *ppp != NULL)
        {
            free((*ppp)[0]);
            free(*ppp), *ppp = NULL;
        }
    }
    Thierry
    "The most important thing in the kitchen is the waste paper basket and it needs to be centrally located.", Donald Knuth
    "If the only tool you have is a hammer, every problem looks like a nail.", probably Abraham Maslow

    FAQ-Python FAQ-C FAQ-C++

    +

  5. #5
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 827
    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 827
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par Leole Voir le message
    Ok donc j'ai mal compris le calloc ...
    Tout à fait. La fonction calloc veut en premier paramètre le nombre d'éléments (toi tu lui passes "3") et en second paramètre la taille d'un élément (là tu lui passes "20 * sizeof(char)"). Le premier paramètre peut se comprendre, le second...

    Citation Envoyé par Leole Voir le message
    Comment accède-ton au premier élément du tableau ?
    Par la syntaxe standard [0]. Une fois qu'une zone a été allouée, on s'y comporte exactement comme avec un tableau...
    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]

  6. #6
    Membre confirmé
    Inscrit en
    Avril 2007
    Messages
    82
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 82
    Par défaut
    Bonjour , réponse un peu tardive désolé , je viens de rentrer chez moi .
    @Thierry Chappuis: Merci ! Je regarde ça de plus près dès maintenant. J'ai déjà manipuler des pointeurs de pointeurs , mais il ya qq temps . Apparement ici ce sont des pointeurs de pointeurs de pointeurs ^^ je crois que je vais prendre un papier
    @Sve@r: En effet , pour le 2e parametre, c'était un copié collé d'un autre de mes programmes où c'était compréhensible , c'est ma faute Sinon pour ma question pour accéder au premier élément du tableau alloué par calloc , c'est en effet ce que je faisais dans le code que j'ai posté par chaine[i] mais j'ai posé la question au vu de la réponse de crocodilex.

    Merci à tous pour vos réponses , je check tout ça

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

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

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 499
    Par défaut
    Citation Envoyé par Leole Voir le message
    Apparement ici ce sont des pointeurs de pointeurs de pointeurs ^^ je crois que je vais prendre un papier
    Seulement pour le destructeur split_delete(). Mais le code de cette fonction n'est pas bien sorcier. Un pointeur sur pointeur ou un pointeur sur pointeur sur pointeur, ce n'est finalement rien d'autre qu'un... pointeur.

    Thierry
    "The most important thing in the kitchen is the waste paper basket and it needs to be centrally located.", Donald Knuth
    "If the only tool you have is a hammer, every problem looks like a nail.", probably Abraham Maslow

    FAQ-Python FAQ-C FAQ-C++

    +

  8. #8
    Membre confirmé
    Inscrit en
    Avril 2007
    Messages
    82
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 82
    Par défaut
    Yep ! J'ai adapté tout ça à mon projet , cela fonctionne et j'ai compris c'est vrai que ce n'est qu'un pointeur


    Bonne nuit et merci

  9. #9
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 827
    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 827
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par Leole Voir le message
    et j'ai compris
    C'était la seule et unique chose à comprendre en C. Félicitations !!!
    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]

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

Discussions similaires

  1. [Fonction]strcpy
    Par Lucky-94 dans le forum C
    Réponses: 23
    Dernier message: 04/03/2006, 15h33
  2. strlen et strcpy non reconnu avec string.h
    Par wolflinger dans le forum C++
    Réponses: 17
    Dernier message: 21/02/2006, 13h44
  3. Strcpy et segmentation fault...
    Par laurent_ifips dans le forum C
    Réponses: 15
    Dernier message: 11/12/2005, 11h23
  4. calloc pointeur & co
    Par evlad dans le forum C
    Réponses: 2
    Dernier message: 11/12/2005, 02h14
  5. calloc remplit il avec "0"
    Par befb dans le forum C
    Réponses: 15
    Dernier message: 25/05/2005, 21h03

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