Separer une chaine en sous chaine

[Résolu]
Signaler
Messages postés
24
Date d'inscription
lundi 30 mai 2005
Statut
Membre
Dernière intervention
19 août 2005
-
Messages postés
24
Date d'inscription
lundi 30 mai 2005
Statut
Membre
Dernière intervention
19 août 2005
-
Bonjour



Je me posais une question , j'aimerais diviser une chaine en sous
chaine pour pouvoir ensuite les trier par longueur de chaine de
caractere



Je m'explique : si je rentre "ceci est un essai" j'aimerais arriver a
classer les mot par longueur mais je ne vois pas de solution a
pars en separant la chaine en plusieurs chaine :s



Voila ce que j'ai deja fait :



#include <stdio.h>

#include <stdlib.h>

#include <string.h>

#include <malloc.h>



void count();

char txt[1000];



int main()

{

printf("\n\nEntrer le texte de votre choix\n\n");

fgets(txt,999,stdin);


printf("\nVous avez rentre : %s\n\n",txt);

count();



return(0);

}



void count()

{

int taille=strlen(txt);

int caract=strlen(txt);

int nb=0,i=0;



for(i;i<taille;++i)

{


if((txt[i]== ' ') || (txt[i] == '\'') || (txt[i] == ',')){

nb++;

caract--;}

}

nb++; //car pas d'esapace en fin de ligne



printf("Il y a : %d mot",nb);

printf("\nIl y a %d caractere (sans espace)",caract-1);

}



Pleassee help

8 réponses

Messages postés
6535
Date d'inscription
lundi 16 décembre 2002
Statut
Modérateur
Dernière intervention
22 août 2010
8
si tu est débutant, c'est sur que mon code n'est pas le plus facile à
comprendre (en gros txt est le pointeur vers le debut du texte, et
txt+taille pointe vers la fin). Je refais autrement:



char* tab[100]; //tableau de mot

int i = 0; //comteur pour tab

char* ptr = txt;

for(int j = 0; j < taille; j++)

{

if(*ptr == ' ')

{

*ptr = 0; // on le fait a chaque fois, pour bien séparer les mots

ptr++; //ptr +1 car le debut est l'espace

tab[i] = ptr; //tab[i] pointe sur la position actuelle de ptr, c'est a dire le debut d'un mot

i++;

j++;

}

ptr++;

}

Tu n'a peut être pas encore bien saisie la notion de pointeur. Si on ne fait pas à chaque fois *ptr = 0, voila ce qu'on obtient:

char* tab[] = {"ceci est un essai", "est un essai", "un essai", "essai"};

Ce n'est pas ce qu'on veut, tu vois qu'on doit remplacer les espace pas des 0, qui permetttent de spécifier la fin d'un chaine
Messages postés
6535
Date d'inscription
lundi 16 décembre 2002
Statut
Modérateur
Dernière intervention
22 août 2010
8
Oui en geos c'est ca: tu sépares grace aux espaces. Il suffit que tu
construises un tableau de char* contenant toutes les positions juste
après un espace (ou caractère des séparation quoi). Puis tu remplace
tous les espaces par des 0 pour que chaque pointeur ne pointe que sur
un seul mote.

Dans ton exemple, tu obtiendras

char* tab[] = {"ceci", "est", "un", "essai"};

En mémoire, la chaine initiale est "ceci est un essai" et devient donc "ceci\0est\0un\0essai"

Tu n'a plus ensuite qu'a trier tab avec ta méthode préférée, par exemple qsort
Messages postés
24
Date d'inscription
lundi 30 mai 2005
Statut
Membre
Dernière intervention
19 août 2005

Dans ton exemple, tu obtiendras

char* tab[] = {"ceci", "est", "un", "essai"};



Justement je ne vois pas comment obtenir un tableau de mot au lieu d'un tableau de caractere :s

Car quand je recupere avec le fgets j'obtiens un tableau du style :

txt[0]=c

txt[1]=e

txt[2]=c

txt[3]=i
Messages postés
6535
Date d'inscription
lundi 16 décembre 2002
Statut
Modérateur
Dernière intervention
22 août 2010
8
J'utilise un tableau de char*, pas un tableau de char:



char* tab[100];

int i = 0;

for(char* ptr = txt; ptr != txt + taille; ptr++)

{

if(*ptr == ' ')

{

*ptr = 0;

ptr++;

tab[i] = ptr;

i++;

}

}
Messages postés
24
Date d'inscription
lundi 30 mai 2005
Statut
Membre
Dernière intervention
19 août 2005

je ne vois pas la difference entre :

char *txt et char* txt :s



Je suis desoler je suis debutant en C et je ne vois toujours pas du tout comment faire
Messages postés
6535
Date d'inscription
lundi 16 décembre 2002
Statut
Modérateur
Dernière intervention
22 août 2010
8
Non bien sur c'est pareil. tab est un tableau en plus de txt. Chaque élément de tab pointe vers une position dans txt
Messages postés
24
Date d'inscription
lundi 30 mai 2005
Statut
Membre
Dernière intervention
19 août 2005

attend je reprend et je regarde si j'ai bien compris



char* tab[100]; //tableau de mot

int i = 0; //comteur pour tab

for(char* ptr = txt; ptr != txt + taille; ptr++) //La je pige pas trop

{

if(*ptr == ' ')

{

*ptr = 0;

ptr++; //ptr +1 car le debut est l'espace

tab[i] = ptr; //La justement je comprend pas pourquoi

i++;

}

}



Voila mes question (je sais je suis enervant )

1/char* ptr = txt //Pourquoi txt n'a pas de position [i] si on parcours
toutes la chaine au premier espace tab[i] contiendera le reste de la
chaine ?

2/ptr != txt + taille //que vient faire le txt ??

3/ *ptr = 0; //pourquoi on l'initialise a chaque fois ?



Desoler
Messages postés
24
Date d'inscription
lundi 30 mai 2005
Statut
Membre
Dernière intervention
19 août 2005

ahhhh ok



Je viens de comprendre , je te remerci :) (je pensais que c'etais *ptr = &txt :D)