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 :

Modif d'une variable char* dans une fonction


Sujet :

C

  1. #1
    Membre actif
    Inscrit en
    Juin 2002
    Messages
    409
    Détails du profil
    Informations forums :
    Inscription : Juin 2002
    Messages : 409
    Points : 234
    Points
    234
    Par défaut Modif d'une variable char* dans une fonction
    Bonjour,
    Décidemment j'ai du mal avec les char*

    j'ai écrit une fonction comme ceci :
    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
    static bool ExtractVariableName (const char *Source, char* DestName)
    {
        // The function look if the Source is a variable name and if it is, it extract just the name and stock it in DestName
        // A variable in the document is specify with its name between brackets '[' and ']'
        // If it is effectively a variable it return TRUE else it return FALSE
     
        DestName = "";
        if ((Source[0] == '[') and (Source[strlen(Source)-1]==']'))
        {
            const char* i = &Source[1];
            strncpy(DestName, i,strlen(Source)-2);
            return true;
        }
        return false;
    }

    Ca plante au niveau de strncpy. Je pense que c'est parceque la taille de DestName = 0. Je pensais que strncpy se chargait du redimensionnement de la variable destination mais ce n'est apparemment pas le cas.
    Est ce que c'est bien de là que vient mon problème et comment faire ce redimensionnement ?

    Merci d'avance pour vos réponses.

  2. #2
    Invité(e)
    Invité(e)
    Par défaut
    Bonjour,
    Citation Envoyé par kase74 Voir le message
    Je pensais que strncpy se chargait du redimensionnement de la variable destination mais ce n'est apparemment pas le cas.
    Qu'entends tu par "redimensionnement" ? allocation mémoire ?

    Pour allouer une chaine, on peut utiliser malloc, calloc voire realloc.
    Pour dupliquer une chaine, on peut utiliser strdup.

    La façon dont tu appelles ExtractVariableName suppose que DestName pointe sur un tableau déjà alloué et suffisamment grand.

    Si la fonction ExtractVariableName doit allouer l'espace pour DestName, alors, il faut passer en second paramètre un pointeur sur chaine.

    Deux solutions :
    1) appel à ExtractVariableName comme aujourd'hui avec DestName alloué et suffisamment grand

    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
    static int ExtractVariableName (const char *Source, char* DestName)
    {
        // The function look if the Source is a variable name and if it is, it extract just the name and stock it in DestName
        // A variable in the document is specify with its name between brackets '[' and ']'
        // If it is effectively a variable it return TRUE else it return FALSE
        if((NULL == DestName) || (NULL == Source))
        {
            return 0;
        }
     
        DestName[0] = '\0';
        if ((Source[0] == '[') &&(Source[strlen(Source)-1]==']'))
        {
            const char* i = &Source[1];
            /* problème ici : on est pas sur qu'il y a suffisamment de place 
                là où on veut écrire ... */
            strncpy(DestName, i,strlen(Source)-2);
            return 1;
        }
        return 0;
    }
     
    ...
     
    char nom[256];
     
    ExtractVariableName("[toto]", nom);
    2) avec une fonction ExtractVariableName qui alloue l'espace dont elle a besoin:

    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
    static int ExtractVariableName (const char *Source, char** DestName)
    {
        int err = 0;
        size_t size;
        if((NULL == DestName) || (NULL == Source))
        {
            err = 1;
        } 
        size = strlen(Source);
        if ((Source[0] == '[') && (Source[size - 1]==']'))
        {  
            * DestName = malloc(size -1);
            if(NULL == *DestName)
            {
                err = 2
            }
            else
            {
                strncpy(*DestName, Source + 1,size -2);
            }
        }
        else
        {
            err = 3;
        }
        return err;
    }
     
    ...
     
    char *nom;
     
    int ret = ExtractVariableName("[toto]", &nom);
     
    if(ret == 0) {
        /* la fonction a réussi */
        /* on peut utiliser nom */
        ...
        free(nom);
    }
    De plus, DestName = ""; n'est pas un moyen de copier une chaine de caractère.

    PS : bool, true, false et and, connais pas.

  3. #3
    Membre du Club Avatar de floopi51
    Inscrit en
    Octobre 2008
    Messages
    136
    Détails du profil
    Informations forums :
    Inscription : Octobre 2008
    Messages : 136
    Points : 62
    Points
    62
    Par défaut
    tu dois allouer la mémoire pour Destname :

    1. soit dynamiquement avec malloc si la taille de ta chaîne est variable,
    2. soit tu définis Destname comme un tableau de char avec une longueur fixe.


    Floopi51

  4. #4
    Membre actif
    Inscrit en
    Juin 2002
    Messages
    409
    Détails du profil
    Informations forums :
    Inscription : Juin 2002
    Messages : 409
    Points : 234
    Points
    234
    Par défaut
    Merci pour vos precieuses reponses qui m'on permis de regler mon probleme.

    Voici ma 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
    static bool ExtractVariableName (const char *Source, char** DestName)
    {
        // The function look if the Source is a variable name and if it is, it extract just the name and stock it in DestName
        // A variable in the document is specify with its name between brackets '[' and ']'
        // If it is effectively a variable it return TRUE else it return FALSE
        if((NULL == DestName) || (NULL == Source))
            return false;
     
        if ((Source[0] == '[') and (Source[strlen(Source)-1]==']'))
        {
            size_t FinalSize = strlen(Source)-2;
            *DestName = (char*) malloc(FinalSize+1);
            if (!*DestName) return false;
            strncpy(*DestName, Source+1,FinalSize);
            (*DestName)[FinalSize] = '\0';
            return true;
        }
        return false;
    }
    J'avoue que j'ai eu du mal pour comprendre comment passer correctement ma variable. Et je n'aurais jamais pense a utiliser un double pointeur (char**).
    Mais en fait c'est tres logique ! char* est une chaine et il me fallait un pointeur sur une chaine. Je sais pas pourquoi, c'est la forme qui devait me gener ...

    En tous cas, encore merci.

  5. #5
    Invité(e)
    Invité(e)
    Par défaut
    Quelques remarques :
    • Il est inutile de caster le retour du malloc;
    • le type bool n'existe pas en c pre 99;
    • le mot clef and n'existe pas du tout.


    Compiles tu en c99, as tu défini and bool, true et false toi même ou utilises tu un compilateur c++ pour du code écrit en c ?

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

Discussions similaires

  1. Utiliser une variable char dans une condition
    Par cedriclv dans le forum C
    Réponses: 6
    Dernier message: 11/06/2014, 18h38
  2. Réponses: 9
    Dernier message: 23/06/2009, 10h54
  3. Réponses: 1
    Dernier message: 20/04/2007, 09h12
  4. [PHP-JS] mettre une variable javascript dans une variable php
    Par Mounr dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 20/04/2007, 09h09
  5. récupérer une variable javascript dans une variable java
    Par tx dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 06/07/2006, 17h55

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