strchr

strchr - C - Programmation

Marsh Posté le 28-05-2004 à 16:07:33    

Bonjour,
strchr permet dans une chaine de trouver la premiere position où apparait le caractere mentionné mais comment faire pour trouver la deuxieme occurence du caractère.
Merci de la part d'un nOOb

Reply

Marsh Posté le 28-05-2004 à 16:07:33   

Reply

Marsh Posté le 28-05-2004 à 16:09:10    

et bien tu recommences à partir de la position+1 que te renvoie strchr, si tant es que cette position soit valide

Reply

Marsh Posté le 28-05-2004 à 16:14:07    

euh du genre :

Code :
  1. char* adr
  2. adr = strchr(adr,"-" )


pour la deuxième occurence de "-" ???

Reply

Marsh Posté le 28-05-2004 à 16:31:04    

...
 
déjà avec ça tu perds le début de ta chaine ?
 
pour la deuxième occurence ? ben cherches un peu quand, meêm faut pas déconner, surtout que pour chercher un simple caractère ...

Reply

Marsh Posté le 29-05-2004 à 09:13:37    

sans regarder le prototype, je suppose que strstr te renvoie l'adresse de la premier occurence dans un pointeur ....
 
et bien tu fais une première execution  
adr = strchr (adr, "-" );
 
tu teste si tu as trouvé "-" sur l'objet que l'on pointe 1 première fois
if (*adr == "-" )  
{    
 printf("j'ai trouve l\'occurence de \"-\"" );
 /*comme t'as dis taz, tu recommences a partir de la position p+1*/
 adr = strchr (adr+1, "-" );
 if (*adr == "-" )  
  printf("j'ai trouve l\'occurence de \"-\" une deuxieme fois" );
 else  
  printf("j'ai trouve qu\"une fois" );
}
else
   printf("je n\'ai pas trouve \"-\"" );
 
voila je pense que l'on peux faire comme ca,  voila l'idée
 
PS : par contre dans les printf je sais pas trop comment faire afficher les simples et double quote, je sais pas s'il suffit de mettre un \, mais ca c'est pas grave tu peux eviter ...

Reply

Marsh Posté le 29-05-2004 à 10:11:44    

et boom :o

Reply

Marsh Posté le 29-05-2004 à 13:16:53    

avec le code de weed jimagine ce quil va nous faire qd y faudra trouver les 5 ere occurences  :D

Reply

Marsh Posté le 29-05-2004 à 13:22:02    

j'ai été au plus simple  
sinon pour trouver la 5ème occurence, en effet il faudrait mettre une boucle for pour repeeter 5 fois ...
c ca que vous ne trouvez pas optimisé

Reply

Marsh Posté le 29-05-2004 à 13:24:13    

red faction a écrit :

avec le code de weed jimagine ce quil va nous faire qd y faudra trouver les 5 ere occurences  :D

ouais, ben s'il trouve quelque chose vous m'appeler

Reply

Marsh Posté le 29-05-2004 à 13:28:17    

oki, ca n'a pas l'air de bien fonctionner alors
j'ai essayer de faire ca vite fais  
mais apparrement non c'est pas bon du tout

Reply

Marsh Posté le 29-05-2004 à 13:28:17   

Reply

Marsh Posté le 29-05-2004 à 13:32:44    

le problème c'est que strstr retourne NULL ou un pointeur sur le premier caractère de la sous chaine
 
donc tes if (*adr == "-" ) seront toujours vrais à moins de segfaulter

Reply

Marsh Posté le 29-05-2004 à 13:41:24    

"VALEUR RENVOYÉE
       La  fonction  strstr()  renvoie  un  pointeur  sur le début de la sous-
       chaîne, ou NULL si celle-ci n'est pas trouvée."
 
en effet tu as raison, alors on peux tester si on pointe vers null ou pas. Si c'est pas NULL on cherche la 2ème occurence et si c'est pas null, on arrete de chercher.

Reply

Marsh Posté le 01-06-2004 à 11:51:58    

Bon j'ai fait ca :
 

Code :
  1. FILE* fichier;
  2.     FILE* fichier2;
  3.     char stringbuf[200];
  4.     char* a, b;
  5.     fichier = fopen("./essai.txt","r" );
  6.     fichier2 = fopen("./test.txt","a" );
  7.     while (fgets(stringbuf, 200, fichier) != NULL){
  8.         a = strchr(stringbuf, '-');
  9.         a = a+1;
  10.         while(*a != '-'){
  11.                 fwrite((void*)a,1,1,fichier2);
  12.         }
  13.     }
  14.     fclose(fichier);
  15.     fclose(fichier2);


 
En fait j'ai des chaine de caractere du genre :
 

Code :
  1. 33-15-45-12
  2. 33-17-45-14
  3. ...


 
donc je charge les lignes du fichiers une par une et je dois récuperer le deuxieme nombre (entre les "-" ).
malheureusement ca plante au milieu ...
quelqu'un pour m'aider  :(  
merci

Reply

Marsh Posté le 01-06-2004 à 16:10:57    

le nombre de tirets est toujours fixe ? car dans ce cas, un simple sscanf suffirait je pense.

Reply

Marsh Posté le 01-06-2004 à 18:20:35    

si les tailles restent costantes tu fais juste :
 

Code :
  1. //Pour le 1e nb
  2. read( fd, &buf, 3);
  3. //Nb nombre recherché
  4. read( fd, &buf, 2);
  5. //Transforme char en int
  6. nb = atoi( &buf );


 
dans nb il y a ton 2e nombre
pour le test des ereurs tu gere par contre, la c'est juste la base... Sinon tu fais une boucle et tu teste ( buf == '-'  )


Message édité par MK Prog le 01-06-2004 à 18:20:58

---------------
Make a VS Program.
Reply

Marsh Posté le 01-06-2004 à 19:17:29    

Généralement, si le ou les fichiers ne sont pas trop volumineux, il est préférable de les charger une bonne fois pour toute en mémoire via open() et read() (sans passer par les f*) , et de travailler sur le buffer  de lecture.

Reply

Marsh Posté le 01-06-2004 à 19:30:20    

vous savez toujours pas lire un man, c'est affligeant. pour le reste, il vaut toujours mieux utiliser les FILE* à cause de leur bufferisation. tout charger avec un seul read, ça marche, mais c'est assez marginale, et pour des ploucs (:D) on va éviter tant ce peu de promener un pointeur le long d'un gros buffer

Reply

Marsh Posté le 01-06-2004 à 19:41:12    

Tout lire avec les FILE * et leur bufferisation n'est pas la solution usuelle, si ce n'est pour des prototypes ou des codes d'étudiants.
Autant faire les choses propres du premier coup.
Pourquoi pas le fgetc() tant qu'on y est ? (comme dans certains outils de compression/décompresion).
Le seul intérêt de la stdio peut être le fprintf et son atomicité à la ligne (et encore, avec un max).
Quant au terme "PLOUC", il me semble qu'il faut savoir rester humble devant le C et la culture informatique en générale.

Reply

Marsh Posté le 02-06-2004 à 01:31:56    

oula vous prenez un peu la tete je pense
il faut pas oublier pas le meme niveau que vous donc niveau perf on s'en fou un peu ....
enfin bon si vous me cherchez, je suis dehors

Reply

Marsh Posté le 02-06-2004 à 10:06:54    

bon le nombre de tirets n'est pas toujours fixe et les tailles ne sont pas constantes donc vos solutions ne s'appliquaient pas à mon cas ...
Mais j'ai trouvé mon bonheur avec strtok donc mon problème est solutionné.
Merci encore

Reply

Marsh Posté le 02-06-2004 à 14:54:38    

de toute facon la question est pas la car avec fread on peut aussi choisir le nombre d'octets a lire, c'est juste que c'est plus simple a comprendre read au debut...
 
Et au fait les pro, si vous en etes, vous l'avez toujours pas prouvé, personne a su répondre a toutes les question posé sur le focus et l'ecran.


---------------
Make a VS Program.
Reply

Marsh Posté le 03-06-2004 à 16:52:41    

j'ai un autre problème  :fou:  
j'ai une ligne de ce type là :

Code :
  1. stringbuf = "bla;bla;nombre"


et qd je fais ca :

Code :
  1. valuee = strrchr(stringbufp, ';')+1;


valuee me renvoie nombre"
et ce " me rend  :fou:  
je ne comprends pas du tout comment il apparait ... surtout que je ne l'avais pas avant, j'ai fait quelques modifs et puis je suis revenu à mon code qui marchait et depuis j'ai ce "
Quelqu'un pour m'aider svp  :cry:

Reply

Marsh Posté le 03-06-2004 à 17:15:34    

? ça te renvoie juste une position ni plus ni moins

Reply

Marsh Posté le 03-06-2004 à 17:17:29    

non valuee est un char* donc qd je fais un fprintf il me renvoie la chaine de caractere nombre mais il me rajoute un " à la fin ...

Reply

Marsh Posté le 03-06-2004 à 17:27:01    

non. il rajoute rien du tout. valuee c'est un pointeur sur une sous chaine de strgbufp. si y un caractère qui te plait pas, c'est pas strrchr qui le rajoute

Reply

Marsh Posté le 03-06-2004 à 18:43:50    

Taz a raison valuee est une addresse indiquant la position du 1e ';'. Tu sais sa en revient au meme systeme que au-dessus, tu veux detecter des caractere.  
 
Je l'ai fais, tu fais un fopen et fread de 1 octet et si c'est un ';' tu incremente une variable. Ainsi tu connait donc la position du truc a lire et le nombre de ';' passé.
 
Faut juste remettre la variable d'incrementation a zero lorsque tu lit un '\n'.
 
Maintenant si tu sais pas faire sa demerde toi, y a pas plus simple.


---------------
Make a VS Program.
Reply

Marsh Posté le 07-06-2004 à 10:32:30    

je pense que c'est un problème avec un caractère de fin de chaine ou un caractere de fin de ligne ... strrchr ne rajouterai-t-il pas un \n ou \0 et qd je visualise avec un fprint il m'afficherait ce caractère avec un " ???

Reply

Marsh Posté le 07-06-2004 à 10:46:20    

MK Prog a écrit :

Faut juste remettre la variable d'incrementation a zero lorsque tu lit un '\n'.
 
Maintenant si tu sais pas faire sa demerde toi, y a pas plus simple.


 
c'est ca j'avais mal lu en effet.
je pense que ca pose probleme qd il lit un \n ... il m'affiche à la place un " ...
bon j'ai toujours pas trouvé la solution à mon pb , je suis désolé c'est pas si simple pour tout le monde  :sarcastic:

Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed