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 :

fonctions avec pointeurs


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Invité
    Invité(e)
    Par défaut fonctions avec pointeurs
    Bonjour,

    voila : je dois réaliser un travail sur les pointeurs avec différentes fonctions. mais je bloque sur deux fonctions :

    - char *strchr ( const char *s, char t) ou je dois retourner l'adresse de la 1ere occurrence du caractère t.
    - char *strdup ( const char *s) où je dois dupliquer la chaine de caractère s et renvoyer l'adresse de la nouvelle chaine. et l'espace memoire devra être alloué par la fonction.

    Merci de votre aide !
    Dernière modification par Invité ; 07/03/2015 à 10h53.

  2. #2
    Invité
    Invité(e)
    Par défaut
    Quel est ton problème ? Quels sont tes essaies ? Qu'est ce qui te bloque ?

    Avec aussi peu d'info... comment veux-tu que l'on te vienne en aide ?

  3. #3
    Invité
    Invité(e)
    Par défaut
    Je dois reproduire les fonctions de la bibliothèque en detail donc sans utiliser les strlen(a,b) par exemple.

    http://nicolasj.developpez.com/articles/libc/string/

    Actuellement j'ai fais les copies et la longueur ainsi que la comparaison mais je ne sais pas comment je peux faire pour l'occurence et la duplication.

    j'ai mes chaines définies telles que :

    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
     
    int strlen ( char* cs){
     
        char* deb = cs;
        while ( *cs != '\0' ){
        cs++;
        }
        return cs - deb;
     
    }
     
    //copie src dans dst y compris '\0'
    char* strcpy (char* dst, const char* src){
     
        while ( ( *dst = *src ) != '\0' ) {
            ++dst;
            ++src;
        }
        return dst;
     
    }
     
    //identique mais se limiter a n caractères
    char* strncpy (char* dst, const char* src, int n){
     
     
     while (( *dst = *src ) != '\0'  ) {
         ++dst;
         ++src;
     }
     
     return dst;
     
    }
     
    /*
     
    //concatène la chaine ct à la suite de s et retourne s
    char* strcat(char* s, const char* ct){
     
    }

  4. #4
    Membre expérimenté
    Homme Profil pro
    Inscrit en
    Juillet 2012
    Messages
    200
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Bénin

    Informations forums :
    Inscription : Juillet 2012
    Messages : 200
    Par défaut
    Bonsoir. Deux ou trois à propos de votre code.
    Votre fonction strlen devrait renvoyer un objet de type size_t au lieu de int. Il est conseillé d'utiliser le type size_t pour les variables représentant les tailles d'objets. Ensuite pour calculer la taille de la chaîne vous faites une différence entre deux pointeurs. Ce n'est pas une bonne idée. La bonne méthode est (à mon humble avis)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    size_t strlen( char* cs) {
        size_t longueur = 0;
     
        while ( *cs != '\0' ) {
            longueur++;
            cs++;
        }
     
        return longueur;
    }
    Ensuite je vous conseille d'écrire un code lisible et facile à comprendre, au lieu d'obscures instructions telles que
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    while (( *dst = *src ) != '\0'  ) {
         ++dst;
         ++src;
     }
    On comprend ce que vous voulez faire, mais cela demande un temps de réflexion. Alors que si vous faisiez quelque chose de simple du genre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    tmp = dst;
     
    *tmp = *src;
     while (*src != '\0') {
         tmp++;
         dst++;
         *tmp = *src;
    } 
    return dest;
    L'idée est juste de détailler les étapes de la fonction. Laissez le travail d'optimisation au compilateur.
    Ensuite la fonctions pour chercher un caractère dans une chaîne. Elle se contente de parcourir la chaîne et de comparer les éléments au caractère recherché. La recherche s'arrête si le caractère est trouvé ou si la fin de la chaîne est atteinte.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    char *strchr(char *s, char c) 
    {
        char *tmp = s;
        while ((*tmp != c) && (*tmp != '\0'))
            tmp++;
     
        // Si le caractère courant est le caractère de fin de chaîne alors le caractère recherché n'appartient pas à la chaîne.
        // Sinon le caractère courant est le caractère recherché
        if (*tmp = '\0')
            return NULL;
        else
             return tmp;
    }
    La fonction pour dupliquer une chaîne se contente juste d'allouer une mémoire de la taille de la chaîne source + 1 (pour le caractère de fin de chaîne) et d'y copier la chaîne source. Elle renvoir ensuite l'adresse du bloc alloué.

  5. #5
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 835
    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 835
    Billets dans le blog
    1
    Par défaut
    Bonjour
    Citation Envoyé par iTEEECH Voir le message
    Actuellement j'ai fais les copies et la longueur ainsi que la comparaison mais je ne sais pas comment je peux faire pour l'occurence et la duplication.
    Pour la duplication, il te faut allouer (malloc) l'espace nécessaire pour stocker une seconde fois la chaine reçue (sans oublier que la chaine contient un '\0' invisible) puis recopier la chaine reçue dans l'espace alloué (sans oublier d'y recopier aussi le '\0')

    Citation Envoyé par iTEEECH Voir le message
    Code c : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    //copie src dans dst y compris '\0'
    char* strcpy (char* dst, const char* src){
     
        while ( ( *dst = *src ) != '\0' ) {
            ++dst;
            ++src;
        }
        return dst;
     
    }
    Tant qu'à vouloir sacrifier la lisibilité à la compacité, autant alors assumer totalement...
    Code c : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    //copie src dans dst y compris '\0'
    char* strcpy (char* dst, const char* src){
        while ( ( *dst++ = *src++ ) != '\0' );
        return dst;
     }

    Citation Envoyé par esired Voir le message
    Votre fonction strlen devrait renvoyer un objet de type size_t au lieu de int. Il est conseillé d'utiliser le type size_t pour les variables représentant les tailles d'objets.
    Dans l'absolu c'est vrai. Mais n'oublie pas que c'est un débutant et qu'il vaut mieux ne pas trop l'embrouiller avec ce genre de détails...
    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 actif Avatar de Waether
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2015
    Messages
    44
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2015
    Messages : 44
    Par défaut
    Yop

    Pour ton strchr il va faloir parcourir (while) ta chaîne et effectuer un test (if) pour savoir si le carractère sur lequel ton pointeur est correspond au charactère où tu désires t'arrêter.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    char *str = "abcdef";
    char car = 'e';
     
    if (*str == car)
    Pour le strdup c'est comme ton strcpy sauf que tu dois alouer une nouvelle chaîne de charactere avant de copier.
    Là comme l'a dit Sve@r malloc t'aideras dans ta tâche.
    Ton strlen pourra lui aussi t'aider à savoir quelle taille tu as besoin d'alouer.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    // le proto de malloc
    void *malloc(size_t size);
     
    // et un petit exemple d'utilisation
    char *str;
    int taille;
     
    str = malloc(sizeof(char) * taille);

Discussions similaires

  1. fonction avec pointeurs
    Par odysseeh dans le forum C++
    Réponses: 13
    Dernier message: 13/04/2013, 12h11
  2. appel d'une fonction avec pointeur comme argument
    Par airness86180 dans le forum Débuter
    Réponses: 1
    Dernier message: 06/03/2009, 13h34
  3. Réponses: 11
    Dernier message: 25/03/2008, 23h12
  4. [WinCE5.0] Dll-Appel de fonction avec pointeur
    Par Bart_lx dans le forum Windows
    Réponses: 11
    Dernier message: 11/12/2007, 11h43
  5. Réponses: 8
    Dernier message: 10/03/2006, 17h28

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