begin process at 2012 05 30 17:59:42
  Trouver un code source :
 
dans
 
Accueil > Forum > 

C

 > 

Divers

 > 

Divers

 > 

Split de chaine de caracteres


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

Split de chaine de caracteres

mardi 16 janvier 2007 à 02:15:43 | Split de chaine de caracteres

lektrosonic

Existe-il une fonction predefinie qui transforme char[ ]="ceci|est|une|chaine|separee/0"  en char1[]="ceci", char2[]="est" .... ?

l3KTr0 Was HeRe
mardi 16 janvier 2007 à 05:00:22 | Re : Split de chaine de caracteres

SAKingdom

Membre Club
strtok
Exemple:
char buffer[] = "salut a tous";
char *ptr[3];

ptr[0] = strtok(buffer," ");
ptr[1] = strtok(0, " ");
ptr[2] = strtok(0, "\0");

C++ (@++)

mardi 16 janvier 2007 à 09:37:36 | Re : Split de chaine de caracteres

BruNews

Administrateur CodeS-SourceS
strtok est une vieille daube qu'il convient d'oublier cause que pas safe thread.
On fait la même chose en balladant 2 pointeurs et pas de bugs en multi thread.

ciao...
BruNews, MVP VC++
mardi 16 janvier 2007 à 16:08:57 | Re : Split de chaine de caracteres

SAKingdom

Membre Club
Je m'en doute. Je ne m'en sers jamais. J'utilise plutôt mes propres routines mais si je n'avais pas donné d'exemple avec strtok mais avec mes routines, quelqu'un d'autre aurais ramené cette fonction sur le planché.
Tu dois probablement être mieu placé que moi pour le savoir mais on s'écoeure à la longue de se faire dire que sa méthode de travail n'est pas bonne et qu'une fonction désuette ou boulet (sprintf) est meilleur malgré le fait que ce n'est pas vrai du tout. Ou encore, que l'on m'ignore quand je dit, par exemple, que lire un fichier tout d'un coup et traiter le buffer avec des pointeurs après est beaucoup plus rapide que de lire que par petite section à la fois. Très frustrant tout ça.
Fini de chialer... Voici donc la routine en question. À optimiser probablement (j'ai jamais eu à traiter ce genre de context). Elle stock le tout dans un tableau de pointeur:

char test[] = "salut a tous";
char *ptr[3], *c = &test[0], *d = c;
int i = 0;

while(1)
{
    if(*c == ' ' || *c == '\n')
    {
        *c = 0;
         ptr[i++] = d; d = c+1;
    }
    else if(!*c) { ptr[i] = d; break; }
    c++;
}

printf("%s %s %s\n", ptr[0], ptr[1], ptr[2]);

C++ (@++)

mardi 16 janvier 2007 à 16:28:26 | Re : Split de chaine de caracteres

BruNews

Administrateur CodeS-SourceS
Un concert de pleureuses ne doit pas nous empêcher de coder.
Il ne faut pas craindre de se répéter, seulement d'être incompris.

ciao...
BruNews, MVP VC++
mardi 16 janvier 2007 à 17:28:39 | Re : Split de chaine de caracteres

lektrosonic

hmm SAKingnom...peut tu expliquer en 2 mots comment tu reussit a spliter ?
j ai pas compris pourquoi tu utilise une boucle infini...

l3KTr0 Was HeRe
mardi 16 janvier 2007 à 17:48:23 | Re : Split de chaine de caracteres

SAKingdom

Membre Club
La boucle n'est pas infinie. J'ai pas beaucoup de talent dans les explications mais:

...
char *ptr[3], *c = &test[0]
char *d = c; // <- Sers à pointer sur le "début" du mot
...

while(1)
{
    if(*c == ' ' || *c == '\n') // <- On roule jusqu'à trouver un espace ou un saut de ligne
    {
        *c = 0; // <- On remplace l'occurance par un 0 de fin de chaine
         ptr[i++] = d; // <- On fait pointer un des pointeurs du tableau sur le mot
        d = c+1; // <- On fais pointer d sur la position du second mot (+1 pour sauter l'occurance)
    }
    else if(!*c) { ptr[i] = d; break; } // Si on rencontre un 0, on pointe sur le dernier mot et on quitte
    c++;
}

En gros, cette routine roule jusqu'à trouver une occurance. Elle remplace celle-ci par un 0 pour créé une chaine, fais pointer un des pointeurs du tableau sur la "nouvelle" chaine puis sauvegarde la première position après l'occurance (qui devrais être la première lettre d'une autre chaine) et ainsi de suite jusqu'à la rencontre du 0 de fin de chaine de la vrai chaine. Elle ne fais donc là que pointer le mot et elle quitte directement la boucle.

Attention, il ne s'agit que de pointeur. Il reste donc dépendant de la chaine principal (qui ce retrouve donc modifié). Si tu écrase la chaine principal, les pointeurs risque de ne plus pointer sur la bonne location.

Si tu veux garder la chaine principal intacte ou si tu veux la réutiliser pour autre chose, j'ai un autre code qui sauvegarde les chaines dans un tableau à 2 dimensions tout en laissant la principal inchangé. Si ça t'interesse...

C++ (@++)

mardi 16 janvier 2007 à 17:56:47 | Re : Split de chaine de caracteres

lektrosonic


Oui sa m interesse..peux tu me la montrer sil te plait ?
l3KTr0 Was HeRe
mardi 16 janvier 2007 à 18:07:13 | Re : Split de chaine de caracteres

SAKingdom

Membre Club
Ça fait un moment que je l'est fais celle-là elle n'est donc pas très optimisé (n'utilise pas de pointeur entre autre) mais fais tout de même l'affaire. À toi de l'optimiser et/ou modifier à tes besoins:

char buffer[] = "salut a tous";
char tab[3][10]; // <- 3 mots de chacun 9 char + 0 de fin de chaine
int i = 0, j = 0;

while(1)
{
     int k = 0;
    while(buffer[i] != ' ' && buffer[i] != '\n' && buffer[i])
    {
        tab[j][k] = buffer[i];
        i++; k++;
    }
    tab[j][k] = 0;
    if(!buffer[i]) break;
    i++; j++;
}

tab[0] contien "Salut" tab[1] contien "a" et tab[2] contien "tous"

C++ (@++)

mardi 16 janvier 2007 à 18:13:09 | Re : Split de chaine de caracteres

lektrosonic

Je te remercie.

l3KTr0 Was HeRe

1 2

Cette discussion est classée dans : chaine, caracteres, split


Répondre à ce message

Sujets en rapport avec ce message

Chaine de caracteres !!! [ par mantalotus ] Comment puis-je transformer un chaine de caractères en une chaine de bits et inversement.Merci de votre aide. Chaine de caracteres [ par youssef22 ] Bonjour,Je suis entrain d'ecrire un petit programme qui genere a chaque fois un mot, et affiche le mot sous forme de tirets, et demande a l'utilisateu Pb de reallocation d'un tableau de chaine de caracteres [ par kobee12 ] J'ai un petit probleme. En effet j'ai un tableau defini de la maniere suivante : char* tab[12];Je charge des chaines de caracteres dans mon tableau. E Troncature à l'unité ou selection de caracteres dans une chaine [ par zelze ] Voila mon problème:Je débute a peine au C++ et j'ai déjà un problème, j'ai besoin de faire la troncature a l'unité d'un nombre, pouvez vous m'aider?Ou Chaine de caracteres [ par LordBob ] Salut a tous,voila j'ai une question seulement, je ne sais pas trop comment la poser ou plutot l'expliquer... Alors, je vais faire comme je peux... al Chaine de caracteres aléatoire [ par winwarrior ] Bon voila je voudrai simplement que ce code retourne une chaine de caracteres aléatoire je comprend pas ce qui cloche nlors de la compilation ça me ma Envoyer une chaine de caracteres a une autre appli [ par fredcpp ] Bonjour,Je cherche a envoyer une chaine de caractere depuis mon programme vers une appli windows ( notepad par exemple ).Tout ca de facon a ce que l'a copier nombre dans chaine de caracteres?? [ par dletozeun ] bonjour,Je cherche une fonction capable de copier un entier dans une chaine de caracteres et une autre fonction capable de transformer une chaine de c Pb avec fonction retournant chaine de caractères [ par dragon3x6 ] Bonjour,peut - on retourner une chaine de caracteres avec une fonction ?j'ai ecris une fonction qui renvoie une chaine de caracteres du type 'char cha chaine de caractere de taille variable [ par habibdu70 ] slt,savez vous comment modifier la taille d'une chaine de caractere ?par exemple si le nom de fichier fait 8 caracteres, je creai un fichier de 8 cara


Nos sponsors


Sondage...

CalendriCode

Mai 2012
LMMJVSD
 123456
78910111213
14151617181920
21222324252627
28293031   

Consulter la suite du CalendriCode

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,889 sec (4)

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