Reconnaissance de chaine

cs_Xs Messages postés 368 Date d'inscription mercredi 14 novembre 2001 Statut Membre Dernière intervention 1 septembre 2008 - 28 janv. 2002 à 19:09
Croqmort Messages postés 95 Date d'inscription mercredi 5 décembre 2001 Statut Membre Dernière intervention 27 juin 2006 - 31 janv. 2002 à 22:38
vala, j'ai ecrit dans un fichier a l'aide d'un prog les lignes suivantes :

Manu Chao [poxima estacion : esperanza]

eh bien je voudrai qu'il lise cette chaine et que il mette en memoire tout ce qui est entre crochets. apres cela, il ouvre le fichier
"poxima estacion : esperanza"

ce qui m'arrengerai, c'est que a la suite de

Manu Chao [poxima estacion : esperanza]

il y ai cela

/*
les caracteristique de l'album
*/

pour donner ca :

Manu Chao [poxima estacion : esperanza]
/*
les caracteristique de l'album
*/

Manu Chao1 [poxima estacion : esperanza1]
/*
les caracteristique de l'album 1
*/

Manu Chao2 [poxima estacion : esperanza2]
/*
les caracteristique de l'album 2
*/

11 réponses

Croqmort Messages postés 95 Date d'inscription mercredi 5 décembre 2001 Statut Membre Dernière intervention 27 juin 2006
28 janv. 2002 à 22:33
si tu veux juste lire ce qu'il y'as entre crochet tu peut faire :

bool function(char* Dest,char* Src, int TailleDest,int TailleSrc){
int i=0,i2=0;
bool var = false;

while(i<TailleSrc){
if(Src[i]=='['){
var = true;
i++;
continue;
}
if(Src[i]==']'){
var = false;
return true;
}
if(i2>=TailleDest) return false;
if(var) Dest[i2++] = Src[i];
i++;
}
return false;
}

pi tu fait un truc dans le meme genre pour les caracteristique de l'album

j'ai pas tester le code, je me suis laissé porter par l'imagination :)
0
cs_jpeg Messages postés 40 Date d'inscription lundi 17 décembre 2001 Statut Membre Dernière intervention 25 février 2004 1
29 janv. 2002 à 09:11
Juste une petite précision :
au lieu de parcourir toute la chaine comme le fait notre ami croqmort, il est possible d'utiliser les fonctions strchr (qui donne la première occurence d'un caractère) et strrchr (qui donne la dernière occurence d'un caractère).
Il suffit simplement d'inclure string.h et le tour est joué.
0
Croqmort Messages postés 95 Date d'inscription mercredi 5 décembre 2001 Statut Membre Dernière intervention 27 juin 2006
29 janv. 2002 à 10:20
oui mais les fonctions strchr et strrchr utilise le meme systeme que le mien, c'est a dire, il parcour la chaine, donc autant economiser du temp de travail a l'ordi et de lui faire faire en meme temp que la recherche la copie du texte entre crochet dans la variable, avec strchr on risquerai de faire un code plus long !!
0
cs_jpeg Messages postés 40 Date d'inscription lundi 17 décembre 2001 Statut Membre Dernière intervention 25 février 2004 1
29 janv. 2002 à 13:39
OK ! Je veux bien croire que ta fonction est plus rapide que celle de string.h
Néanmoins, je vais te donner un conseil : utilise des pointeurs au lieu d'utiliser l'opérateur [] sans arrêt parce que ça, ça ralenti ton algo...

bool function(char* Dest,char* Src, int TailleDest,int TailleSrc)
{
int i=0,i2=0;
bool var = false;
char* pSrc=Src;
char* pDest=Dest;

while(i<TailleSrc)
{
if(*(pSrc++)=='[')
{
var = true;
i++;
continue;
}
if(*pSrc==']')
{
var = false;
return true;
}
if(i2>=TailleDest) return false;
if(var)
{
*(pDest++) = *(pSrc++);
i2++;
}
i++;
}
return false;
}
0

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

Posez votre question
Croqmort Messages postés 95 Date d'inscription mercredi 5 décembre 2001 Statut Membre Dernière intervention 27 juin 2006
29 janv. 2002 à 14:06
c'est pas vraiment que ma fonction est plus rapide que strchr, mais c surtout que ça fait pas la meme chose
sinon pour l'utilisation des [] j'avais fait ça pour que ce soit plus clair, mais c vrai que c mieux d'incrementé les pointeurs

sinon pour la suite :
> "... apres cela, il ouvre le fichier "poxima estacion : esperanza""

bah en fait c tout con j'ai pas d'aide sur les fonciton sous la mains, mais utilise "fopen"

aprés :
> "ce qui m'arrengerai, c'est que a la suite de
Manu Chao [poxima estacion : esperanza]
il y ai cela
/*
les caracteristique de l'album
*/"
tu veux ecrire ça dans ton fichier
ou tu veux qu'on lise ça dans le fichier ?
et le fichier "poxima estacion : esperanza" on en fait quoi une fois ouvert ?
0
NerOcrO Messages postés 33 Date d'inscription mardi 10 octobre 2000 Statut Membre Dernière intervention 27 mai 2004
29 janv. 2002 à 19:17
MOi je dirais d'utiliser une liste chaîné dynamique pOur créer tOn prOg principal puis de parcOurir ta liste avec des pOinteurs.
COmme ça, tu peux rajOuter à ta guise tOus les titres d'albums que tu veux.
De plus, sa facilite ce que tu veux faire.
0
cs_Xs Messages postés 368 Date d'inscription mercredi 14 novembre 2001 Statut Membre Dernière intervention 1 septembre 2008
29 janv. 2002 à 20:30
En fait, la deuxieme solution est independante de la premiere : c''est soit la premiere soit la deuxieme.

j'avoue que je preferais la seconde car ca m'eviterais d'avoir 300 fichiers de caracteristiques si j'ai 300 albums....
0
Croqmort Messages postés 95 Date d'inscription mercredi 5 décembre 2001 Statut Membre Dernière intervention 27 juin 2006
29 janv. 2002 à 23:34
bon j'ai encore fait ça sans compilateur alors c pas sur que ça marche !
pour que ça fonctionne il faut que tu fasse passer un pointeur dans 'Src' qui pointe vers le debut de la chaine ou tu veux trouver les caracteristique de l'album
faut aussi que tu fasse passsé dans Dest un pointeur vers une zone de memoire alloué et dont tu fait passer la taille en argument 'TailleDest'
bool function2(char* Dest,char* Src, int TailleDest,int TailleSrc){
int i=0,i2=0;
int etat = 0;
char* pSrc=Src;
char* pDest=Dest;
char c;

while(i<TailleSrc){
switch(etat){
case 0:
if(*(pSrc++)=='/')) etat = 1;
break;
case 1:
if(*(pSrc++)!='*')) etat = 0;
else etat = 2;
break;
case 2:
if((c=*(pSrc++))=='*')) etat = 3;
else{
if(i2>=TailleDest) return false;
*(pDest++) = c;
i2++;
}
break;
case 3:
if((c=*(pSrc++))=='/')) return true;
else{
if(i2>=TailleDest) return false;
*(pDest++) = '*';
i2++;
if(i2>=TailleDest) return false;
*(pDest++) = c;
i2++;
etat = 2;
}
break;

}
}
return false;
}
0
cs_Xs Messages postés 368 Date d'inscription mercredi 14 novembre 2001 Statut Membre Dernière intervention 1 septembre 2008
31 janv. 2002 à 21:10
J'ai bien sur oublie de dire : c bien de la lire mais j'aimerais pouvoir l'afficher !!
en temps normal, je sais comment on fais et surtoutquel est la variable mais la....

voici la parti de mon code de recherche :

bool rechercher() /*L'algo de recherche a été elaboré par Croqmort et jpeg de cppfrance.com*/
{
char c ;
char car[255];
char lookfor[255];

logo2;
aopen = fopen("DB.dcl","r");
if (aopen == NULL)
{
MessageBox (NULL, "DBCD n'a pu ouvrir le fichier "DB.dcl".
Si c'est la premiére fois que vous lancez DBCD, vous devez d'abord ajouter une entré." , "Erreur", 0 + MB_ICONHAND);
exit(0);
}
cout << "\n\nEntrez le nom de l'album recherh\202 : \n";
red;
cin.getline(lookfor,255);
cin.getline(lookfor,255);

char* Dest;
char* Src;
int TailleDest;
int TailleSrc;
int i=0,i2=0;
bool var = false;
char* pSrc=Src;
char* pDest=Dest;

while(i<TailleSrc)
{
if(*(pSrc++)=='[')
{
var = true;
i++;
continue;
}
if(*pSrc==']')
{
var = false;
return true;
}
if(i2>=TailleDest) return false;
if(var)
{
*(pDest++) = *(pSrc++);
i2++;
}
i++;
}
return false;

cout << "\nCA PASSE\n" ;
cout << Dest;
}

bien sur, ni le "CA PASSE" et ni le Dest ne s'affichent !
j'avoue que je ne comprend pasle fonctionnement de votre algo.
0
cs_Xs Messages postés 368 Date d'inscription mercredi 14 novembre 2001 Statut Membre Dernière intervention 1 septembre 2008
31 janv. 2002 à 21:10
J'ai bien sur oublie de dire : c bien de la lire mais j'aimerais pouvoir l'afficher !!
en temps normal, je sais comment on fais et surtoutquel est la variable mais la....

voici la parti de mon code de recherche :

bool rechercher() /*L'algo de recherche a été elaboré par Croqmort et jpeg de cppfrance.com*/
{
char c ;
char car[255];
char lookfor[255];

logo2;
aopen = fopen("DB.dcl","r");
if (aopen == NULL)
{
MessageBox (NULL, "DBCD n'a pu ouvrir le fichier "DB.dcl".
Si c'est la premiére fois que vous lancez DBCD, vous devez d'abord ajouter une entré." , "Erreur", 0 + MB_ICONHAND);
exit(0);
}
cout << "\n\nEntrez le nom de l'album recherh\202 : \n";
red;
cin.getline(lookfor,255);
cin.getline(lookfor,255);

char* Dest;
char* Src;
int TailleDest;
int TailleSrc;
int i=0,i2=0;
bool var = false;
char* pSrc=Src;
char* pDest=Dest;

while(i<TailleSrc)
{
if(*(pSrc++)=='[')
{
var = true;
i++;
continue;
}
if(*pSrc==']')
{
var = false;
return true;
}
if(i2>=TailleDest) return false;
if(var)
{
*(pDest++) = *(pSrc++);
i2++;
}
i++;
}
return false;

cout << "\nCA PASSE\n" ;
cout << Dest;
}

bien sur, ni le "CA PASSE" et ni le Dest ne s'affichent !
j'avoue que je ne comprend pasle fonctionnement de votre algo.
0
Croqmort Messages postés 95 Date d'inscription mercredi 5 décembre 2001 Statut Membre Dernière intervention 27 juin 2006
31 janv. 2002 à 22:38
ça marche pas tout simplement pasque l'algo etait prevu pour etre un fonction independante et non implanter tel quel a l'interieur meme d'une autre fonction !
donc ton programme doit deja planter pasqu'il ne reçoit pas d'argument correct et de plus il y'as un return juste avant ton cout << "ca passe"; !
dans ce cas là il est logique que la fonction s'arrete avant ton "cout"

il faut que tu mette la fonction dans ton prog :

bool function(char* Dest,char* Src, int TailleDest,int TailleSrc)
{
...
}
les ... c pour indiquer que tu met l'interieur de la fonction que jpeg et moi on a fait, mais que ça prendrait trop de place dans mon msg ! donc tu remplace les ... par notre algo !
mais il faut que tu appel cet fonction et non que tu la mette dans ta fonction recherche !

de plus notre algo ne fesait qu'extraire d'une chaine de caractere, la premiere chaine de caractere entre crochet !
donc en fait il faudrait que tu m'envoi ta source en fichier join à CROQMORT@ifrance.com
je te la corrige, en mettant le plus de commentaire possible et je te renvoi tout ça ! y'as un paquet d'erreur je peut pas tout corriger sur le forum
0
Rejoignez-nous