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 :

Mettre chaque mot d'une phrase dans un tableau


Sujet :

C

  1. #1
    Futur Membre du Club
    Femme Profil pro
    Inscrit en
    Février 2013
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Algérie

    Informations forums :
    Inscription : Février 2013
    Messages : 5
    Points : 6
    Points
    6
    Par défaut Mettre chaque mot d'une phrase dans un tableau
    bonjours;
    alors je suis confronté à un problème et je n'arrive pas à le résoudre.
    énoncé :

    " on a un texte et on doit mettre chaque mot de la phrase dans un tableau "

    j'ai par exemple la chaine de caractères suivante
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    char texte = "salut tout le monde"

    mon idée consiste à chercher le vide quand je le trouve je met se qu'il y a avant le vide dans une nouvelle variable qu'on appellera mot
    et donc mot va contenir salut
    puis je mets le contenu de mot dans une case du tableau.
    mais après en suivant le même raisonnement , j'aurais le contenu de mot "salut tout" ce qui est faux.

    que dois je faire
    j'ai passé 2 jours avec ça mais je n'y arrive pas

  2. #2
    Membre expérimenté Avatar de Ngork
    Homme Profil pro
    Barbare IT
    Inscrit en
    Avril 2009
    Messages
    160
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Barbare IT
    Secteur : Finance

    Informations forums :
    Inscription : Avril 2009
    Messages : 160
    Points : 1 372
    Points
    1 372
    Par défaut
    Ecris déjà l'algorithme en langage courant, par exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    boucle : lire le caractère suivant de la chaîne tant qu'il n'est pas nul
      -> si le caractère est le premier lu ou si le précédent est un espace : réserver une chaîne remplie de zéros de (par exemple) 256 caractères pour recevoir le mot
      -> si le caractère est différent d'un espace : copier le caractère à la suite du mot en cours
    fin de la boucle (caractère nul rencontré)
    Bien sûr, ce n'est pas un algorithme bien terrible mais il fonctionne et il est facile à coder en quelques lignes ...
    Tu pourras ensuite trouver mieux et même beaucoup mieux !

    Tu indiques que tu y as passé deux jours, mais tu n'as produit aucun code à nous montrer ???

  3. #3
    Membre régulier Avatar de Fluch
    Homme Profil pro
    Méthodiste flux
    Inscrit en
    Avril 2012
    Messages
    48
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Méthodiste flux
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2012
    Messages : 48
    Points : 81
    Points
    81
    Par défaut Une solution
    Hello selmastar,

    Imagine une feuille Excel avec dans A1 ta phrase.

    En lancant cette procédure, la phrase est décomposée à partir de A2.
    Code vba : 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
    Private Sub CommandButton1_Click()
    Dim Variable As String
    Variable = Cells(1, 1).Value
     
    Position = 2
    retour:
        For t = 1 To 50
            If Right(Left(Variable, t), 1) = " " Then
                Cells(Position, 1) = Left(Variable, t - 1)
                Variable = Right(Variable, Len(Variable) - t)
                Position = Position + 1
                GoTo retour
            End If
        Next t
    Cells(Position, 1) = Variable
    End Sub
    Il y a peut-être plus simple.
    A+

  4. #4
    Futur Membre du Club
    Femme Profil pro
    Inscrit en
    Février 2013
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Algérie

    Informations forums :
    Inscription : Février 2013
    Messages : 5
    Points : 6
    Points
    6
    Par défaut
    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
     
    void decouper_texte(char texte[],type_maillon* p,int *nombre_mot)
    {
        int j=0,k=0,cpt=0;
        int boo_lean=0;
        char mot[LONGUEUR_MAXIMALE+1]="";
        char ch1[LONGUEUR_MAXIMALE+1] = "";
        char ch2[LONGUEUR_MAXIMALE+1] ="";
     
        while ((j<sizeof texte) && (boo_lean = 0))
        {
            if ((int) texte[j] ==32)
            {
                cpt = j;
                strncat(mot,texte,cpt);
                strcpy(p->le_mot,mot);
                p = suivant(p);
     
     
                  //ici je doit mettre à jour la variable texte 
     
                memset(mot,'\0',LONGUEUR_MAXIMALE+1);
                memset(texte,'\0',sizeof texte);
                strcpy(texte,ch1);
                boo_lean = 1;
            }
     
        j++;
        }
    }
    je ne l'ai pas mis au part avant parce que j'ai l'impression de c'est du n'importe quoi mon code

  5. #5
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 721
    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 721
    Points : 31 044
    Points
    31 044
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par selmastar Voir le message
    mon idée consiste à chercher le vide quand je le trouve je met se qu'il y a avant le vide dans une nouvelle variable qu'on appellera mot
    et donc mot va contenir salut
    puis je mets le contenu de mot dans une case du tableau.
    mais après en suivant le même raisonnement , j'aurais le contenu de mot "salut tout" ce qui est faux.
    Salut
    Ton idée est bonne. Te faut juste 2 pointeurs
    1. 1 pointeur que tu places en début de chaine
    2. 1 pointeur qui part du premier et qui s'arrête au premier vide ou au '\0'

    Ensuite te suffit de placer un '\0' à cet endroit et recopier via strcpy() le premier pointeur dans ton mot[x].

    Ensuite, si le second pointeur était sur un vide tu places le premier pointeur juste après lui puis tu places le second pointeur au même endroit pour repartir de cette position. Et si le second pointeur était arrivé au vrai '\0' c'est qu'il avait traité toute la chaine donc c'est fini...

  6. #6
    Membre expert
    Avatar de Metalman
    Homme Profil pro
    Enseignant-Chercheur
    Inscrit en
    Juin 2005
    Messages
    1 049
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Enseignant-Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 1 049
    Points : 3 532
    Points
    3 532
    Par défaut
    Si tu t'autorises les str*, je te conseille strtok !
    (sauf si ton but est de le recoder)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    void fun(char *str)
    {
    char	*tmp, *sep = " ";
     
    tmp = strtok(str, sep);
    tmp = strtok(NULL, sep); /* on rappelle strtok avec NULL pour continuer sur la même chaîne */
    ...
    Et voir le manuel pour la condition d'arrêt (il renvoie NULL je crois.... enfin à vérifier) !

  7. #7
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 721
    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 721
    Points : 31 044
    Points
    31 044
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par Metalman Voir le message
    (sauf si ton but est de le recoder)
    Ben oui, ça ressemble quand-même fortement à un TP de cours quoi...

    Sinon strtok est très dépréciée car non réentrante. On lui préfère maintenant fortement strtok_r...

  8. #8
    Membre du Club
    Homme Profil pro
    Administrateur Système Linux.
    Inscrit en
    Décembre 2012
    Messages
    21
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur Système Linux.

    Informations forums :
    Inscription : Décembre 2012
    Messages : 21
    Points : 58
    Points
    58
    Par défaut
    Bonjour.

    Il est aussi possible de passer par une structure. Dans un de mes codes, j'avais essayé ceci et sa fonctionnais bien.

    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
     
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
     
    struct ch{
    	char chaine[512];
    };
     
    int main(int argc, char* argv[]){
     
    	char *phrase="Voici la chaine a ranger dans la structure";
    	struct ch chaine[512];
    	char delim[]=" ";
    	unsigned char tab[512];
    	memset(tab, 0, 512);
    	int j = 0, i = 0;
    	do {
    		strncat((char *)tab, &phrase[i],1);
    		if (phrase[i] == *delim || i == strlen(phrase)-1) {
    			strcpy(chaine[j].chaine, (char *)tab);
    			memset(tab,0,512);
    			j++;
    		}
    		i++;
        }while(i<strlen(phrase));
     
    	for(i = 0; i<j; i++)
    		printf("mot%d: %s\n", i,chaine[i].chaine);
     
    	return 0;
    }
    Sortie:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    shut@M1nT ~/scripts/C $ ./developpez 
    mot0: Voici 
    mot1: la 
    mot2: chaine 
    mot3: a 
    mot4: ranger 
    mot5: dans 
    mot6: la 
    mot7: structure
    shut@M1nT ~/scripts/C $
    C'est peu être pas la meilleure solution mais sa fonctionne.

    Cordialement,

    0x90_

  9. #9
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 721
    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 721
    Points : 31 044
    Points
    31 044
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par 0x90_ Voir le message
    Bonjour.

    Il est aussi possible de passer par une structure. Dans un de mes codes, j'avais essayé ceci et sa fonctionnais bien.

    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
     
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
     
    struct ch{
    	char chaine[512];
    };
     
    int main(int argc, char* argv[]){
     
    	char *phrase="Voici la chaine a ranger dans la structure";
    	struct ch chaine[512];
    	char delim[]=" ";
    	unsigned char tab[512];
    	memset(tab, 0, 512);
    	int j = 0, i = 0;
    	do {
    		strncat((char *)tab, &phrase[i],1);
    		if (phrase[i] == *delim || i == strlen(phrase)-1) {
    			strcpy(chaine[j].chaine, (char *)tab);
    			memset(tab,0,512);
    			j++;
    		}
    		i++;
        }while(i<strlen(phrase));
     
    	for(i = 0; i<j; i++)
    		printf("mot%d: %s\n", i,chaine[i].chaine);
     
    	return 0;
    }
    Mouais. Déjà tu utilises un tableau de 512 structures, chacune utilisant un tableau de 512 car. Ce qui revient en fait à un tableau en 2D. En plus, passer par cette variable intermédiaire "tab" est un peu inutile (on peut utiliser directement chaine[j].chaine). Donc la chaine aura été copiée en tout 3 fois et au final elle est stockée 2 fois alors qu'on pourrait se contenter de ne conserver que des pointeurs utiles vers la première mais en contrepartie on accepte de modifier quelque peu celle-ci (en remplaçant les espaces par des '\0').
    Et en plus ce delim qui est une chaine alors qu'il aurait pu être un simple car. Si encore cela était dans un but d'évolution en laissant la possibilité d'avoir des délimiteurs multiples j'aurais compris mais il n'y a même pas de boucle de recherche sur l'ensemble des délimiteurs de la chaine. Seul le premier est testé...

    Citation Envoyé par 0x90_ Voir le message
    C'est peut être pas la meilleure solution mais ça fonctionne.
    Ce n'est pas souvent le seul critère demandé à un code...

  10. #10
    Membre chevronné
    Avatar de imperio
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2010
    Messages
    853
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2010
    Messages : 853
    Points : 2 167
    Points
    2 167
    Par défaut
    Le sujet tombe souvent ces derniers temps... Le plus simple est de parcourir ta chaîne pour compter le nombre de mots, créer un tableau de chaîne de caractères puis reparcourir ta chaîne initiale en copiant les mots un par un dans ton char**.

Discussions similaires

  1. Réponses: 4
    Dernier message: 22/07/2014, 08h15
  2. [XL-2010] Couper/coller des mots d'une phrase dans une autre cellule
    Par oxxymore dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 10/01/2013, 14h02
  3. [PowerShell] Mettre des mots d'une ligne dans un tableau
    Par julie75 dans le forum Scripts/Batch
    Réponses: 1
    Dernier message: 07/07/2011, 11h04
  4. [PHP 5.0] Rechercher les mots d'une phrase dans une table
    Par tutomania dans le forum Langage
    Réponses: 8
    Dernier message: 16/12/2009, 12h30
  5. Rechercher un mot ou une phrase dans un fichier
    Par cellendhyll dans le forum Général Python
    Réponses: 3
    Dernier message: 12/06/2007, 11h52

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