Reconnaissance de chaine

Signaler
Messages postés
368
Date d'inscription
mercredi 14 novembre 2001
Statut
Membre
Dernière intervention
1 septembre 2008
-
Messages postés
95
Date d'inscription
mercredi 5 décembre 2001
Statut
Membre
Dernière intervention
27 juin 2006
-
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

Messages postés
95
Date d'inscription
mercredi 5 décembre 2001
Statut
Membre
Dernière intervention
27 juin 2006

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 :)
Messages postés
40
Date d'inscription
lundi 17 décembre 2001
Statut
Membre
Dernière intervention
25 février 2004

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é.
Messages postés
95
Date d'inscription
mercredi 5 décembre 2001
Statut
Membre
Dernière intervention
27 juin 2006

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 !!
Messages postés
40
Date d'inscription
lundi 17 décembre 2001
Statut
Membre
Dernière intervention
25 février 2004

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;
}
Messages postés
95
Date d'inscription
mercredi 5 décembre 2001
Statut
Membre
Dernière intervention
27 juin 2006

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 ?
Messages postés
33
Date d'inscription
mardi 10 octobre 2000
Statut
Membre
Dernière intervention
27 mai 2004

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.
Messages postés
368
Date d'inscription
mercredi 14 novembre 2001
Statut
Membre
Dernière intervention
1 septembre 2008

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....
Messages postés
95
Date d'inscription
mercredi 5 décembre 2001
Statut
Membre
Dernière intervention
27 juin 2006

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;
}
Messages postés
368
Date d'inscription
mercredi 14 novembre 2001
Statut
Membre
Dernière intervention
1 septembre 2008

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.
Messages postés
368
Date d'inscription
mercredi 14 novembre 2001
Statut
Membre
Dernière intervention
1 septembre 2008

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.
Messages postés
95
Date d'inscription
mercredi 5 décembre 2001
Statut
Membre
Dernière intervention
27 juin 2006

ç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