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 :

Compréhension des pointeurs


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 9
    Par défaut Compréhension des pointeurs
    Bonjour,

    Je suis actuellement étudiant, et j'ai eu un cours sur les pointeurs. A la suite de ce cours j'ai eu droit à des exercices, dont un me demandant de retourner la valeur 1 si un caractère d'une chaine est en miniscule ou s'il n'y a pas de caractère et 0 sinon.

    Jusque là pas de souci, le problème, c'est que je n'arrive pas à tester ma fonction que voici :

    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
    int my_str_islower(*str)
    {
      int inc;
      inc = 0;
      while (*str[inc] != '\0')
          {
             if ((*str > "97") && (*str < "123") || (*str == ""))
                return (1);
             else
                return (0);
          }
    } 
     
    int main()
    {
      char *str;
      str[0] = '5';
      str[1] = '55';
      str[2] = '120';
      str[3] = '\0';
      my_str_islower(*str);
      return(0);
    }
    Et le résultat à chaque fois que je compile est segmentation fault. Je sais que cela viens des valeurs que je donne à mon pointeur, mais je ne comprends pas pourquoi... Quelqu'un pourrait-il m'expliquer (et m'aider par la même occasion)?

  2. #2
    Expert confirmé
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Par défaut
    Bonjour et bienvenue sur ce Forum.

    Pas mal d'erreurs de base :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
      char *str;
      str[0] = '5';
      str[1] = '55';
      str[2] = '120';
      str[3] = '\0';....
    str est un pointeur, pas un tableau. Un pointeur est fait pour contenir une adresse.
    Pour stocker un ensemble de valeurs, utiliser un tableau et passer le tableau à la fonction :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
      char str[4]; // 4 au moins
      str[0] = '5';
      str[1] = '55';
      str[2] = '120';
      str[3] = '\0';
      my_str_islower(str); ....
    La fonction reçoit l'adresse du premier élément du tableau (un char) donc une valeur du type char * :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    int my_str_islower(char * str)
    On accède dans la fonction aux éléments du tableau par str[inc]
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    while (str[inc] != '\0') ...
    Et on teste. Il est plus simple d'utiliser comme constantes de comparaison 'a' et 'z'. plutôt que 97 ou 123 (dans tous les cas, ce ne peut être "97" et "123" qui sont des chaines dee caractères)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if ((str[inc] >='a') && (str[inc] <= 'z')) ....
    A noter qu'il existe une fonction standard pour cette comparaison : islower() (inclure <ctype.h>)

  3. #3
    Membre habitué
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 9
    Par défaut
    Merci pour cet accueil, et aussi pour cette réponse très édifiante.
    Je me doutais que cette fonction existait. Mais le but de nos exercices est justement de coder ses fonctions, et de les compiler dans une librairie qui nous sera propre.

    Hormis cela, on nous oblige à utiliser la table ASCII, d'où le 97 > 123.
    Le pointeur aussi est obligatoire, puisque la fonction doit être syntaxée de la façon suivante : int my_str_islower(char *str)

    Pour ce qui est du stockage, en effet, j'ai appris la façon d'utiliser un pointeur :

    *ptr = valeur;
    ptr = &var;

    Mais un prof m'a appris a entrer les valeur comme dans un tableau, c'est la raison pour laquelle j'utilisais cette méthode.

    De plus, au lieu de créer une variable dans mon main, si je mets directement la valeur en paramètre :

    my_str_islower('casse-tete');

    Cela produit également un segmentation fault. Donc au final je m'embrouille un peu...

  4. #4
    Expert confirmé
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Par défaut
    Hormis cela, on nous oblige à utiliser la table ASCII, d'où le 97 > 123.
    Oui, mais 'a' vaut 97 et '{' (le suivant de 'z') vaut 123. C'est simplement beaucoup plus lisible d'utiliser 'a' que 97.
    Le pointeur aussi est obligatoire, puisque la fonction doit être syntaxée de la façon suivante : int my_str_islower(char *str)
    Le fait que le prototype spécifie char * str n'interdit pas du tout que l'argument soit un tableau de char (à une dimension). Dans mon message précédent, je passe à la fonction un tableau et le paramètre est char *
    Mais un prof m'a appris a entrer les valeur comme dans un tableau, c'est la raison pour laquelle j'utilisais cette méthode.
    Mais il faut alors que ce soit un tableau, pas un simple pointeur

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    my_str_islower('casse-tete');
    Les chaines de caractères sont entre guillemets doubles " pas entre guillemets simples.

    Teste ce genre de code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
      char str[] = "ABcDeF"; 
      my_str_islower(str); 
    // ou
      my_str_islower("ABcDeF");

  5. #5
    Membre habitué
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 9
    Par défaut
    D'accord, les guillemets sont passées, je vais maintenant essayer le tableau.

    Merci beaucoup!

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

Discussions similaires

  1. Libérer des pointeurs dans une std::map
    Par GaldorSP dans le forum SL & STL
    Réponses: 2
    Dernier message: 09/07/2005, 14h42
  2. à propos des pointeurs
    Par salseropom dans le forum C++
    Réponses: 20
    Dernier message: 24/03/2005, 09h37
  3. [DEBUTANTE][ECLIPSE] Pb de compréhension des package SERVLET
    Par fchafia dans le forum Eclipse Java
    Réponses: 2
    Dernier message: 18/02/2005, 16h55
  4. [FLASH MX] Prob de compréhension des bouttons
    Par WriteLN dans le forum Flash
    Réponses: 13
    Dernier message: 16/10/2003, 17h01
  5. Problème de compréhension des ensembles
    Par Cornell dans le forum Langage
    Réponses: 6
    Dernier message: 07/02/2003, 22h07

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