begin process at 2012 05 30 09:03:04
  Trouver un code source :
 
dans
 
Accueil > Forum > 

Archive C/C++

 > 

Archives

 > 

Au secours

 > 

Separer une chaine en sous chaine


Derniers messages déposésPoser une question dans le forum ou lancer une discussion

Separer une chaine en sous chaine

jeudi 2 juin 2005 à 21:25:15 | Separer une chaine en sous chaine

firemax

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

jeudi 2 juin 2005 à 21:49:40 | Re : Separer une chaine en sous chaine

vecchio56

Administrateur CodeS-SourceS
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

jeudi 2 juin 2005 à 22:10:39 | Re : Separer une chaine en sous chaine

firemax

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


jeudi 2 juin 2005 à 22:18:00 | Re : Separer une chaine en sous chaine

vecchio56

Administrateur CodeS-SourceS
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++;
  }
}

jeudi 2 juin 2005 à 22:23:02 | Re : Separer une chaine en sous chaine

firemax

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


jeudi 2 juin 2005 à 22:25:53 | Re : Separer une chaine en sous chaine

vecchio56

Administrateur CodeS-SourceS
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
jeudi 2 juin 2005 à 22:40:14 | Re : Separer une chaine en sous chaine

firemax

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

jeudi 2 juin 2005 à 23:38:40 | Re : Separer une chaine en sous chaine

vecchio56

Administrateur CodeS-SourceS
Réponse acceptée !
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

vendredi 3 juin 2005 à 02:08:09 | Re : Separer une chaine en sous chaine

firemax

ahhhh ok

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





Cette discussion est classée dans : int, chaine, txt, printf, include


Répondre à ce message

Sujets en rapport avec ce message

Probleme reception sur un serveur windows en vc++ [ par alfred ] Salut a tous!!g un probleme dans mon serveur le recv renvoie la valeur -1 et je ne vois pas pouquoi, toute mes socket sont positives le client envois [debutant]Operation de chaine encore :s [ par firemax ] Bonjour Certain reconaitrons ce code (surtout vecchio56) mais voila ca marche toujours pas et je ne comprend pas :'( Please helllppp Code : #in oh non!! [ par bako25 ] Le prog suivant  calcule le nombre des 'e' dans un paragraphe: #include #include< Chaine de caractère [ par Thanatoster ] Bonjour a tous, mon problème est le suivant, pour les cours je dois faire un programme d'apres l'énoncé suivant"saisir au clavier des éléments chaine Passage d'argument pour printf [ par Quazar ] BonjourJe cherche à créer une fonction qui aura le même effet que printf, c'est à dire que je passerais à cette fonction une liste de paramètre du mêm affichage bizarre [ par darkwhite ] Salut a tousJe commence par faire une lotterie simple mais j'ai un probleme au niveau de l'affichage d'un tableau, mon code est le suivant#include #in problème de if et else [ par ffnajia ] bonjour je comprend pas pourquoi le programme ci-dessous ne prend pas en compte l'éxistence de if et else!!!???#include#include using namespace std; Mon programme quitte tout seul [ par darkwhite ] Salut j'ai le code suivant tout con ;#include #include int main(int argc, char *argv[]){  int a,b;  printf("1er nombre:");  scanf("%d",&a);  printf("2 affichache d'un document en c [ par godar8 ] j'ai fait un programe  d'editeur de texte en  c  pour cretion document , ajout , supprimer etcmais j'ai un petit  mon document ne s'affiche  pas pour Equation seconde degres [ par sliverman ] Bonsoir a tous, alors voila, ( je commence en éléctro des demain le C et le prof nous a dit se qu'on devra savoir faire au bout des 8h, c'est résoudre


Nos sponsors


Sondage...

CalendriCode

Mai 2012
LMMJVSD
 123456
78910111213
14151617181920
21222324252627
28293031   

Consulter la suite du CalendriCode

Photothèque

A découvrir



 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 0,936 sec (4)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales