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 :

Stoker des "mots" dans une table


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2008
    Messages
    130
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 130
    Par défaut Stoker des "mots" dans une table
    Bonjour je veux faire un code qui me permet de rechercher les mots d'une chaines et stocke le mot dans une table pour cela j'ai fait 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
    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
     
    #include <stdio.h>
    #include <string.h>
     
    #define MAXTAB 50
     
    typedef char* String;          //tableau de type String
    String tab_char[MAXTAB];   //tableau contenant des String enfin c'est ce que j'espere
     
    int is_space(char machaine[], int pos) //test si le caractère courant est un espace
    {
    	if (machaine[pos]==' ')
    		return 0;
    	else
    		return -1;
    }
     
    void ma0(char *t) //vide la chaine
    {
    	int i;
    	for(i=0;i<=MAXTAB+2;i++)
    		t[i]=' ';
    }
     
    int main()
    {
    	char *message="Salut comment ca va ?";
    	int i=0,j=0, k=0;
    	char ch[50]=""; //stocke le mot
     
    	while (i<strlen(message))
    	{
    		if (is_space(message, i)!=0) //si ce n'est pas un espace
    		{
    			ch[j]=message[i]; //je copie le caractère
    			j++; //et j'incrémente
    		}
    		else //je trouve un espace
    		{
    			tab_char[k]=ch; //je stocke le mot dans la table
    			k++; //passe au suivant
    			ma0(ch); //vide la chaine
    			j=0; //ré initialisation du compteur de ch 
    		}
    		i++; //passe au caractère suivant dans message
    	}
     
    	for(i=0;i<MAXTAB;i++) //et affiche
    	{
    		printf("%s\n",tab_char[i]);
    	}
     
    	return 0;
    }
    le problème de mon code est visible lors de l'affichage je n'ai presque que des (null) et et le reste n'est pas fameux =>
    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
    Process started >>>
    ?                                                    
    (null)
    (null)
    (null)
    (null)
    (null)
    (null)
    (null)
    (null)
    (null)
    (null)
    (null)
    (null)
    (null)
    (null)
    (null)
    (null)
    (null)
    (null)
    (null)
    (null)
    (null)
    (null)
    (null)
    (null)
    (null)
    (null)
    (null)
    (null)
    (null)
    (null)
    (null)
    ?                                                    
    (null)
    (null)
    (null)
    (null)
    (null)
    (null)
    (null)
    (null)
    (null)
    (null)
    (null)
    (null)
    (null)
    (null)
    (null)
    (null)
    (null)
    <<< Process finished.
    Voila est ce que vous pouvez m'aider a résoudre mon problème (voire m'indiquer s'il existe une fonction qui stocke les mots dans un tableau même si je doute qu'une telle fonction existe)

  2. #2
    Rédacteur

    Avatar de ram-0000
    Homme Profil pro
    Consultant en sécurité
    Inscrit en
    Mai 2007
    Messages
    11 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultant en sécurité
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2007
    Messages : 11 517
    Par défaut
    tab_char est un tableau (de 50) pointeurs sur caractères

    quand tu trouves un espace:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    tab_char[k]=ch; //je stocke le mot dans la table
    k++; //passe au suivant
    ma0(ch); //vide la chaine
    j=0; //ré initialisation du compteur de ch
    donc dans tous les cas, tab_char[0] = tab_char[1] = ... = ch. Il faut que tu alloues un buffer, que tu recopie la chaine de caractère ch et enfin dans ton tableau ti stockes ce pointeur.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    char *ptr = strdup(ch);   // allocation et copie en une seule fois, c'est cool
    if(ptr == NULL)
    {
       /* traitement d'erreur */
    }
    tab_char[k]=ptr; //je stocke le mot dans la table
    k++; //passe au suivant
    ma0(ch); //vide la chaine
    j=0; //ré initialisation du compteur de ch
    Autre chose, ta fonction ma0() qui réinitialise un buffer, tu peux faire beaucoup simple en faisant ch[0] = 0;

    et lorsque tu copies le caractère, il faut faire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    ch[j]=message[i]; //je copie le caractère
    j++; //et j'incrémente
    ch[j] = 0  // pour ajouter le 0 terminal de la chaine

    De plus, je suppose que ce n'est pas encore un problème mais tu es limité à 50 mots (taille de tab_char) et chaque mot est limité à 50 caractères (taille de ch). Pour info, en allemand, il est possible de construire des mots aussi long que l'on veut sans espace.
    Raymond
    Vous souhaitez participer à la rubrique Réseaux ? Contactez-moi

    Cafuro Cafuro est un outil SNMP dont le but est d'aider les administrateurs système et réseau à configurer leurs équipements SNMP réseau.
    e-verbe Un logiciel de conjugaison des verbes de la langue française.

    Ma page personnelle sur DVP
    .

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2008
    Messages
    130
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 130
    Par défaut
    D'accord alors voila ce que j'ai maintenant :
    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
     
    #include <stdio.h>
    #include <string.h>
     
    #define MAXTAB 50
     
    typedef char* String;          //tableau de type String
    String tab_char[MAXTAB];   //tableau contenant des String enfin c'est ce que j'espere
     
    int is_space(char machaine[], int pos) //test si le caractère courant est un espace
    {
    	if (machaine[pos]==' ')
    		return 0;
    	else
    		return -1;
    }
     
    int main()
    {
    	char *message="Salut comment ca va ?";
    	int i=0,j=0, k=0;
    	char ch[50]=""; //stocke le mot
            char *ptr;
     
    	while (i<strlen(message))
    	{
    		if (is_space(message, i)!=0) //si ce n'est pas un espace
    		{
    			ch[j]=message[i]; //je copie le caractère
    			j++; //et j'incrémente
                            ch[j]=0;
    		}
    		else //je trouve un espace
    		{
                            ptr=strdup(ch);
                            if (ptr != NULL)
                            {
    			      tab_char[k]=ptr; //je stocke le mot dans la table
    			      k++; //passe au suivant
    			      ch[0]=0; //vide la chaine
    			      j=0; //ré initialisation du compteur de ch 
                            }
    		}
    		i++; //passe au caractère suivant dans message
    	}
     
    	for(i=0;i<MAXTAB;i++) //et affiche
    	{
    		printf("%s\n",tab_char[i]);
    	}
     
    	return 0;
    }
    Ce code fonctionne mais le dernier mot ne s'affiche pas sauf si il y a un espace en dernier caractère. Donc j'ai penser à insérer un espace à la fin de la chaine mais je ne vois pas trop comment le faire en C. et si j'ai bien compris ch[j]=0 permet de vider le caractère ?

  4. #4
    Rédacteur

    Avatar de ram-0000
    Homme Profil pro
    Consultant en sécurité
    Inscrit en
    Mai 2007
    Messages
    11 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultant en sécurité
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2007
    Messages : 11 517
    Par défaut
    Non, il suffit de regarder à la fin de ta boucle while si il y a un mot qui est commencé et de l'ajouter
    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
     
    while()
    {
    ...
    }
    if(ch[0] != 0)
    {
       /* il y a un mot dans le buffer */
       ptr=strdup(ch);
       if (ptr != NULL)
       {
          tab_char[k]=ptr; //je stocke le mot dans la table
          k++; //passe au suivant
          ch[0]=0; //vide la chaine
          j=0; //ré initialisation du compteur de ch 
       }   
    }
     
    /* affichage de la table */
    ...
    Raymond
    Vous souhaitez participer à la rubrique Réseaux ? Contactez-moi

    Cafuro Cafuro est un outil SNMP dont le but est d'aider les administrateurs système et réseau à configurer leurs équipements SNMP réseau.
    e-verbe Un logiciel de conjugaison des verbes de la langue française.

    Ma page personnelle sur DVP
    .

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2008
    Messages
    130
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 130
    Par défaut
    d'accord merci beaucoup de votre aide

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

Discussions similaires

  1. [VBA-E]Transfere des données d'Excel dans une table Access
    Par flo83 dans le forum Macros et VBA Excel
    Réponses: 7
    Dernier message: 07/04/2006, 09h22
  2. Récupérer des noms de fichiers dans une table ?
    Par florus dans le forum Access
    Réponses: 5
    Dernier message: 25/03/2006, 17h34
  3. Réponses: 2
    Dernier message: 16/02/2006, 23h09
  4. [Débutant]Comment faire des tranches de nombre dans une tabl
    Par Jedecouvreaccess dans le forum Access
    Réponses: 7
    Dernier message: 05/09/2005, 08h46

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