Separer une chaine en sous chaine [Résolu]

cs_firemax 24 Messages postés lundi 30 mai 2005Date d'inscription 19 août 2005 Dernière intervention - 2 juin 2005 à 21:25 - Dernière réponse : cs_firemax 24 Messages postés lundi 30 mai 2005Date d'inscription 19 août 2005 Dernière intervention
- 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
Afficher la suite 

8 réponses

Répondre au sujet
vecchio56 6539 Messages postés lundi 16 décembre 2002Date d'inscription 22 août 2010 Dernière intervention - 2 juin 2005 à 23:38
+3
Utile
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
Cette réponse vous a-t-elle aidé ?  
Commenter la réponse de vecchio56
vecchio56 6539 Messages postés lundi 16 décembre 2002Date d'inscription 22 août 2010 Dernière intervention - 2 juin 2005 à 21:49
0
Utile
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
Commenter la réponse de vecchio56
cs_firemax 24 Messages postés lundi 30 mai 2005Date d'inscription 19 août 2005 Dernière intervention - 2 juin 2005 à 22:10
0
Utile
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
Commenter la réponse de cs_firemax
vecchio56 6539 Messages postés lundi 16 décembre 2002Date d'inscription 22 août 2010 Dernière intervention - 2 juin 2005 à 22:18
0
Utile
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++;

}

}
Commenter la réponse de vecchio56
cs_firemax 24 Messages postés lundi 30 mai 2005Date d'inscription 19 août 2005 Dernière intervention - 2 juin 2005 à 22:23
0
Utile
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
Commenter la réponse de cs_firemax
vecchio56 6539 Messages postés lundi 16 décembre 2002Date d'inscription 22 août 2010 Dernière intervention - 2 juin 2005 à 22:25
0
Utile
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
Commenter la réponse de vecchio56
cs_firemax 24 Messages postés lundi 30 mai 2005Date d'inscription 19 août 2005 Dernière intervention - 2 juin 2005 à 22:40
0
Utile
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
Commenter la réponse de cs_firemax
cs_firemax 24 Messages postés lundi 30 mai 2005Date d'inscription 19 août 2005 Dernière intervention - 3 juin 2005 à 02:08
0
Utile
ahhhh ok



Je viens de comprendre , je te remerci :) (je pensais que c'etais *ptr = &txt :D)
Commenter la réponse de cs_firemax

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.