Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
2410 connectés 

  FORUM HardWare.fr
  Programmation
  C

  strchr

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

strchr

n°743720
mirascheat
Posté le 28-05-2004 à 16:07:33  profilanswer
 

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

mood
Publicité
Posté le 28-05-2004 à 16:07:33  profilanswer
 

n°743727
Taz
bisounours-codeur
Posté le 28-05-2004 à 16:09:10  profilanswer
 

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

n°743748
mirascheat
Posté le 28-05-2004 à 16:14:07  profilanswer
 

euh du genre :

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


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

n°743806
Taz
bisounours-codeur
Posté le 28-05-2004 à 16:31:04  profilanswer
 

...
 
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 ...

n°744460
weed
Posté le 29-05-2004 à 09:13:37  profilanswer
 

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 ...

n°744485
Taz
bisounours-codeur
Posté le 29-05-2004 à 10:11:44  profilanswer
 

et boom :o

n°744572
red factio​n
Posté le 29-05-2004 à 13:16:53  profilanswer
 

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

n°744574
weed
Posté le 29-05-2004 à 13:22:02  profilanswer
 

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é

n°744575
Taz
bisounours-codeur
Posté le 29-05-2004 à 13:24:13  profilanswer
 

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

n°744579
weed
Posté le 29-05-2004 à 13:28:17  profilanswer
 

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

mood
Publicité
Posté le 29-05-2004 à 13:28:17  profilanswer
 

n°744582
Taz
bisounours-codeur
Posté le 29-05-2004 à 13:32:44  profilanswer
 

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

n°744593
weed
Posté le 29-05-2004 à 13:41:24  profilanswer
 

"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.

n°747117
mirascheat
Posté le 01-06-2004 à 11:51:58  profilanswer
 

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

n°747554
xilebo
noone
Posté le 01-06-2004 à 16:10:57  profilanswer
 

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

n°747766
MK Prog
Make a VS Program.
Posté le 01-06-2004 à 18:20:35  profilanswer
 

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.
n°747822
vivelec
Posté le 01-06-2004 à 19:17:29  profilanswer
 

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.

n°747858
Taz
bisounours-codeur
Posté le 01-06-2004 à 19:30:20  profilanswer
 

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

n°747883
vivelec
Posté le 01-06-2004 à 19:41:12  profilanswer
 

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.

n°748375
weed
Posté le 02-06-2004 à 01:31:56  profilanswer
 

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

n°748521
mirascheat
Posté le 02-06-2004 à 10:06:54  profilanswer
 

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

n°748911
MK Prog
Make a VS Program.
Posté le 02-06-2004 à 14:54:38  profilanswer
 

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.
n°751097
mirascheat
Posté le 03-06-2004 à 16:52:41  profilanswer
 

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:

n°751126
Taz
bisounours-codeur
Posté le 03-06-2004 à 17:15:34  profilanswer
 

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

n°751128
mirascheat
Posté le 03-06-2004 à 17:17:29  profilanswer
 

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 ...

n°751140
Taz
bisounours-codeur
Posté le 03-06-2004 à 17:27:01  profilanswer
 

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

n°751259
MK Prog
Make a VS Program.
Posté le 03-06-2004 à 18:43:50  profilanswer
 

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.
n°754412
mirascheat
Posté le 07-06-2004 à 10:32:30  profilanswer
 

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 " ???

n°754445
mirascheat
Posté le 07-06-2004 à 10:46:20  profilanswer
 

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:

mood
Publicité
Posté le   profilanswer
 


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C

  strchr

 

Sujets relatifs
Plus de sujets relatifs à : strchr


Copyright © 1997-2025 Groupe LDLC (Signaler un contenu illicite / Données personnelles)