Separer une chaine en sous chaine

Résolu
cs_firemax Messages postés 24 Date d'inscription lundi 30 mai 2005 Statut Membre Dernière intervention 19 août 2005 - 2 juin 2005 à 21:25
cs_firemax Messages postés 24 Date d'inscription lundi 30 mai 2005 Statut Membre Dernière intervention 19 août 2005 - 3 juin 2005 à 02:08
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

vecchio56 Messages postés 6535 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 22 août 2010 14
2 juin 2005 à 23:38
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
3
vecchio56 Messages postés 6535 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 22 août 2010 14
2 juin 2005 à 21:49
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
0
cs_firemax Messages postés 24 Date d'inscription lundi 30 mai 2005 Statut Membre Dernière intervention 19 août 2005
2 juin 2005 à 22:10
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
0
vecchio56 Messages postés 6535 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 22 août 2010 14
2 juin 2005 à 22:18
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++;

}

}
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cs_firemax Messages postés 24 Date d'inscription lundi 30 mai 2005 Statut Membre Dernière intervention 19 août 2005
2 juin 2005 à 22:23
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
0
vecchio56 Messages postés 6535 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 22 août 2010 14
2 juin 2005 à 22:25
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
0
cs_firemax Messages postés 24 Date d'inscription lundi 30 mai 2005 Statut Membre Dernière intervention 19 août 2005
2 juin 2005 à 22:40
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
0
cs_firemax Messages postés 24 Date d'inscription lundi 30 mai 2005 Statut Membre Dernière intervention 19 août 2005
3 juin 2005 à 02:08
ahhhh ok



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