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 :

Acceder au premier caractere d'une chaine dans une liste chainee


Sujet :

C

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    50
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Décembre 2004
    Messages : 50
    Points : 39
    Points
    39
    Par défaut Acceder au premier caractere d'une chaine dans une liste chainee
    Bonjour,
    J'espere que le sujet n'est pas trop flou : J'ai une liste chainee qui contient une suite de chaine. Je voudrais comparer le premier caractere de chacune de ces chaines de caractere a un char. J'ai tout betement teste
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    printf("%c", tmp->data[0])
    et
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    printf("%c", tmp->(data[0]));
    mais le premier n'affiche rien et le second
    error: parse error before '(' token
    Cela est-il seulement possible ?

    Merci d'avance !

  2. #2
    Rédacteur
    Avatar de Franck.H
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2004
    Messages
    6 951
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Service public

    Informations forums :
    Inscription : Janvier 2004
    Messages : 6 951
    Points : 12 462
    Points
    12 462
    Par défaut
    Essaye comme ca:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    printf("%c", tmp.data[0]);
    Mon Site
    Ma bibliothèque de gestion des chaînes de caractères en C

    L'imagination est plus importante que le savoir. A. Einstein

    Je ne répond à aucune question technique par MP, merci d'avance !

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    50
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Décembre 2004
    Messages : 50
    Points : 39
    Points
    39
    Par défaut
    Bonjour,
    Merci de ta reponse rapide
    Je travaille dans une sous fonction qui a recu un pointeur sur ma liste chainee. Je ne peut donc pas faire tmp.data, mais seulement tmp->data.

    tmp.data ni tmp.data[0] ne marche donc..

    Un autre idee ?

  4. #4
    Rédacteur
    Avatar de Franck.H
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2004
    Messages
    6 951
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Service public

    Informations forums :
    Inscription : Janvier 2004
    Messages : 6 951
    Points : 12 462
    Points
    12 462
    Par défaut
    Ton tableau, c'est un tableau statique ou dynamique ? Sinon montre ton code, réduit au minimum en situant le problème mais compilable !

    Normalement:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    printf("%c", tmp->data[0]);
    devrais fonctionner d'après mes tests rapides donc si ca ne t'affiche rien... montre le code remplissant ce tableau et la fonction qui lit le tableau !
    Mon Site
    Ma bibliothèque de gestion des chaînes de caractères en C

    L'imagination est plus importante que le savoir. A. Einstein

    Je ne répond à aucune question technique par MP, merci d'avance !

  5. #5
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    50
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Décembre 2004
    Messages : 50
    Points : 39
    Points
    39
    Par défaut
    J'ai teste, l'erreur est :
    error: request for member `data' in something not a structure or union
    Voila mon code (reduit et commente) :

    Fonction appelant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    char            *fonction(...)
    {
      t_list        *list;  // declaration d'un pointeur sur ma liste chainee
     
      list = 0;             // initialisation de la liste
      appel(&list, ...);  // appel a ma sous fonction, avec l'adresse du pointeur en parametre
      aff_list(list);
    }
    Fonction appellee :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    void            appel(t_list **list, ...)
    {
      t_list        *tmp; // un pointeur sur la liste chainee
     
      tmp = *list; // on donne la valeur de l'adresse de la liste chainee initialise dans la fonction precedente
      while (tmp != 0)
        {
          printf("%c", tmp.data[0]);  // voila mon test
          tmp = tmp->next; // on passe a la chaine suivante dans la liste
        }
    }
    Pour info ma liste chainee ressemble a sa :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    typedef struct          s_list
    {
      char                  *data;
      struct s_list         *next;
    }                       t_list;
    Un exemple de ce que je voudrais :

    Un liste chaine contenant ces chaines :

    Albert
    Alexandre
    Bernard
    Guillaume

    je voudrais enregistrer chaque chaine (chaque adresse plutot) dont le data[0] est egal a A par exemple

  6. #6
    Rédacteur
    Avatar de Franck.H
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2004
    Messages
    6 951
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Service public

    Informations forums :
    Inscription : Janvier 2004
    Messages : 6 951
    Points : 12 462
    Points
    12 462
    Par défaut
    Citation Envoyé par Toutankharton
    J'ai teste, l'erreur est ...
    Ouais désolé, j'avais pas tout lu dans ton message, j'ai rectifié le tir par la suite


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    char            *fonction(...)
    {
      t_list        *list;  // declaration d'un pointeur sur ma liste chainee
     
      list = 0;             // initialisation de la liste
      appel(&list, ...);  // appel a ma sous fonction, avec l'adresse du pointeur en parametre
      aff_list(list);
    }
    Je ne vois pas d'allocation de ta liste et de ton tableau de char, est-ce normal ? Si tu déclares un pointeur que t'initialise à 0 (déjà à NULL ce serait peut être mieux pour un pointeur) puis tu passes son adresse (ici null) à une autre fonction ... tu risque pas d'aller très loin là ! A cet instant précis, ta liste n'existe pas encore et dans la fonction appelée tu veut déjà la parcourrir ... y'a une mouche dans le lait là
    Mon Site
    Ma bibliothèque de gestion des chaînes de caractères en C

    L'imagination est plus importante que le savoir. A. Einstein

    Je ne répond à aucune question technique par MP, merci d'avance !

  7. #7
    Membre expert
    Avatar de hiko-seijuro
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    2 011
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 2 011
    Points : 3 065
    Points
    3 065
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    t_list        *list;  // declaration d'un pointeur sur ma liste chainee
     
      list = 0;             // initialisation de la liste
      appel(&list, ...);
    euh quel est l'interet d'un pointeur sur pointeur ?????????????????????????????
    Hiko-seijuro

    n'cha - hoyoyo gang

    espace perso : http://hiko-seijuro.developpez.com
    dernier tuto : Introduction à l'éditeur de texte Emacs sous linux
    consulter les faqs : http://www.developpez.com/faq
    PAS DE QUESTIONS TECHNIQUES PAR MP OU MAIL

  8. #8
    Rédacteur
    Avatar de Franck.H
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2004
    Messages
    6 951
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Service public

    Informations forums :
    Inscription : Janvier 2004
    Messages : 6 951
    Points : 12 462
    Points
    12 462
    Par défaut
    Citation Envoyé par hiko-seijuro
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    t_list        *list;  // declaration d'un pointeur sur ma liste chainee
     
      list = 0;             // initialisation de la liste
      appel(&list, ...);
    euh quel est l'interet d'un pointeur sur pointeur ?????????????????????????????
    C'est vrai, j'avais pas fait attention à ca je dirais que dans son cas, aucun intérêt vu qu'il ne modifie pas son pointeur dans la fonction ...
    Mon Site
    Ma bibliothèque de gestion des chaînes de caractères en C

    L'imagination est plus importante que le savoir. A. Einstein

    Je ne répond à aucune question technique par MP, merci d'avance !

  9. #9
    Rédacteur/Modérateur
    Avatar de Trap D
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    4 942
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 4 942
    Points : 6 498
    Points
    6 498
    Par défaut
    On pourrait voir le code d'initialisation de la liste ?
    "La haine seule fait des choix" - Koan Zen
    "Il ne faut pas être meilleur que les autres, il faut être meilleur que soi." Albert Jacquard
    "Ceux qui savent où ils ont posé leur parapluie ne sont pas alcooliques." - pgibonne.
    Faites du Prolog, ça vous changera les idées !
    Ma page Prolog
    Mes codes sources commentés

    Mon avatar : La Madeleine à la veilleuse de Georges de La Tour

  10. #10
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    50
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Décembre 2004
    Messages : 50
    Points : 39
    Points
    39
    Par défaut
    Je ne vois pas d'allocation de ta liste et de ton tableau de char, est-ce normal ?
    Dans ma fonction (ici appellée fonction) j'appelle une sous fonction qui gere l'insertion dans la liste des données avec une boucle de cette façon :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    list = my_put_in_list(list, "mes données malocées");
    le point t_liste *list sert donc a enregistrer l'adresse de la chaine courante pour pouvoir inserer la suivante à sa suite.

    quel est l'interet d'un pointeur sur pointeur ?
    Comme je travaille par sous fonctions pour ne pas surcharger ma fonctions principales, je suis obligé d'envoyer des pointeurs. Ici il s'agit d'un pointeur sur une chaine de caractere d'une liste chainée. Donc j'envoit son adresse en faisany t_list **list.
    Est-ce clair ?

    aucun intérêt vu qu'il ne modifie pas son pointeur dans la fonction ...
    Je veut bien envoyer mes fichiers mais tout poster sur le forum serais lourd. Je modifie mon pointeur dans ma fonction, mais je ne vous montre la que les bouts necessaire a la comprehension de mon probleme : afficher le caractere n°1 d'une chaine de caractere donnée dans une liste chainée

    On pourrait voir le code d'initialisation de la liste ?
    Le code d'initialisation ? Qand je met en commentaire initialisation de la liste, c'est juste que je met à 0 la premiere adresse (il n'y a pas d'adresse pour une chaine suivante). la variable list changera au fur et à mesure que l'on inserera les données. Voici mon my_put_in_list qui insere les données *data a la suite de la chaine pointée par list :

    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
    t_list          *my_put_in_list(t_list *list, char *data)
    {
      t_list        *new_elem;
      t_list        *temp;
     
      new_elem = malloc(sizeof(*new_elem));
      new_elem->data = data;
      new_elem->next = 0;
      if(list == 0)
        return new_elem;
      else
        {
          temp = list;
          while(temp->next != 0)
            {
              temp = temp->next;
            }
          temp->next = new_elem;
          return list;
        }
    }
    (desolé pour les tabulations, elles partent au copié-collé dans putty apparemment...)

    Bref, je veux bien expliquer et publier tout mon code, mais ça ne servirais pas a grand chose, mon probleme est relativement isolé. Je peut faire un petit programme presentant mon probleme si vous voulez. Si temp.data[0] marche en theorie, y a-t-il un equivalent quand on travaille sur des pointeurs de structures (temp->data) ?

    Merci d'avance !

  11. #11
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par Toutankharton
    Si temp.data[0] marche en theorie, y a-t-il un equivalent quand on travaille sur des pointeurs de structures (temp->data) ?
    temp->data[0];
    Pas de Wi-Fi à la maison : CPL

  12. #12
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    50
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Décembre 2004
    Messages : 50
    Points : 39
    Points
    39
    Par défaut
    Comme je le disais dans mon premier message, ça n'affiche rien, et temp->(data[0]) :

    error: parse error before '(' token

  13. #13
    Rédacteur/Modérateur
    Avatar de Trap D
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    4 942
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 4 942
    Points : 6 498
    Points
    6 498
    Par défaut
    Ça ne devrait pas passer à la compilation ou tout au moins te faire un warning car la fonction ne retourne rien.
    Il faut de plus que tu testes le retour de malloc :
    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
    t_list *my_put_in_list(t_list *list, char *data)
    {
      t_list *new_elem;
      t_list *temp;
     
      new_elem = malloc(sizeof(*new_elem));
     
     
      // toujours tester le retour de malloc
      if (new_elem == NULL)
        return NULL;
     
      // Pas très secure comme méthode, c'est une source de bug.
      // il faudrait mieux recopier les données avec un strdup par exemple
      new_elem->data = data;
      new_elem->next = 0;
     
      if(list == 0)
        return new_elem;
     
      temp = list;
      while(temp->next != 0)
      {
        temp = temp->next;
      }
      temp->next = new_elem;
      return list;
    }
    Ceci dit, ce n'est pas ça qui fait mal fonctionner ton programme.
    "La haine seule fait des choix" - Koan Zen
    "Il ne faut pas être meilleur que les autres, il faut être meilleur que soi." Albert Jacquard
    "Ceux qui savent où ils ont posé leur parapluie ne sont pas alcooliques." - pgibonne.
    Faites du Prolog, ça vous changera les idées !
    Ma page Prolog
    Mes codes sources commentés

    Mon avatar : La Madeleine à la veilleuse de Georges de La Tour

  14. #14
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par Toutankharton
    Comme je le disais dans mon premier message, ça affiche
    Gné ?
    Quand on a un doute, on fait un 'snippet', c'est à dire un code complet mais réduit au minimum qui montre le problème :
    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
    #include <stdio.h>
     
    struct node
    {
       char *s;
    };
     
    int main (void)
    {
       struct node n = {"hello"};
       struct node *p = &n;
     
       printf ("%c\n", p->s[0]) ;
     
       return 0;
    }
    Et là, ben je ne vois pas de problème.

    C'est donc dans ton code qu'il y a un lézard, ou alors tu n'as pas expliqué comme il faut...
    Pas de Wi-Fi à la maison : CPL

  15. #15
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    50
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Décembre 2004
    Messages : 50
    Points : 39
    Points
    39
    Par défaut
    oops ! J'avais oublié de faire l'appel à cette sous fonction dans la fonction principale ! Je suis désolé, des le debut c'etait bon, je verifiais par acquis de conscience apres mon precedent message...

    temp->data[0] marche donc..

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

Discussions similaires

  1. recherche d'une chaine dans une chaine
    Par Katachana dans le forum Langage
    Réponses: 2
    Dernier message: 15/07/2008, 12h10
  2. recherche d'une chaine dans une chaine
    Par jpclutier dans le forum Shell et commandes GNU
    Réponses: 3
    Dernier message: 03/12/2007, 11h30
  3. Tester une chaine dans une chaine
    Par ulysse031 dans le forum Algorithmes et structures de données
    Réponses: 13
    Dernier message: 26/03/2007, 00h48
  4. chercher caractére d'une chaine dans une chaine
    Par ulysse031 dans le forum Langage
    Réponses: 25
    Dernier message: 21/03/2007, 18h09
  5. Réponses: 2
    Dernier message: 19/10/2005, 15h38

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