remplacer en C

remplacer en C - C++ - Programmation

Marsh Posté le 26-08-2002 à 15:49:39    

Je n'arrive pas à trouver de fonction permettant de remplacer un caractère par un autre en C. J'ai parcouru le string.h et relu des bouquins. Rien. Recherche sur le forum : rien...
 
La fonction existe-t-elle ou est ce que je dois la réécrire ?
 
merci.

Reply

Marsh Posté le 26-08-2002 à 15:49:39   

Reply

Marsh Posté le 26-08-2002 à 15:52:00    

dans la librairie de base, j'pense pas qu'elle existe, réécris là. C pas bien compliqué !

Reply

Marsh Posté le 26-08-2002 à 15:52:09    

Je pense pas, mais ça se fait vite:
 

Code :
  1. void changechar(char *string,char c1,char c2)
  2. {
  3.    char *c;
  4.    while( (c = strchr(string,c1))
  5.     {
  6.        *c = c2;
  7.     }
  8. }


Message édité par LetoII le 26-08-2002 à 15:52:16
Reply

Marsh Posté le 26-08-2002 à 15:58:15    

Ok merci :)
 
Je suis pas super bon en dev et je pige pas tout :(
Le remplacement se fait où ? à [cpp]*c=c2[fixed] ??
 
je suis trop mauvais.. je m'en vais.

Reply

Marsh Posté le 26-08-2002 à 15:59:29    

black_lord a écrit a écrit :

Ok merci :)
 
Je suis pas super bon en dev et je pige pas tout :(
Le remplacement se fait où ? à [cpp]*c=c2[fixed] ??
 
je suis trop mauvais.. je m'en vais.




 
c bien ça

Reply

Marsh Posté le 26-08-2002 à 16:01:23    

letoII a écrit a écrit :

 
 
c bien ça




tu lui confirmes donc qu'il est mauvais ? [:ddr555]


---------------
J'ai un string dans l'array (Paris Hilton)
Reply

Marsh Posté le 26-08-2002 à 16:03:37    

il n'y a rien d'explicite pour dire que c2 remplace c1 ?
 
C'est parce que *c est un pointeur ?
 
Si c'est ça je me coucherai moins bête :)
 
Merci à vous :)

Reply

Marsh Posté le 26-08-2002 à 16:06:32    

Harkonnen a écrit a écrit :

 
tu lui confirmes donc qu'il est mauvais ? [:ddr555]
 




 
 
 :lol:

Reply

Marsh Posté le 26-08-2002 à 16:07:18    

black_lord a écrit a écrit :

il n'y a rien d'explicite pour dire que c2 remplace c1 ?
 
C'est parce que *c est un pointeur ?
 
Si c'est ça je me coucherai moins bête :)
 
Merci à vous :)




 
En fait ça marche pas :D

Reply

Marsh Posté le 26-08-2002 à 16:08:44    

black_lord a écrit a écrit :

il n'y a rien d'explicite pour dire que c2 remplace c1 ?
 
C'est parce que *c est un pointeur ?
 
Si c'est ça je me coucherai moins bête :)
 
Merci à vous :)




 
Bah, si, le = c'est l'affectation en C, tu sais ça qd même !?
comme pour un entier.
*c n'est pas un pointeur, *c c'est le carractère. c est un pointeur vers *c

Reply

Marsh Posté le 26-08-2002 à 16:08:44   

Reply

Marsh Posté le 26-08-2002 à 16:09:10    

letoII a écrit a écrit :

 
 
En fait ça marche pas :D
 




 
comment ça ça marche pas !??

Reply

Marsh Posté le 26-08-2002 à 16:09:19    

Code :
  1. void changechar(char *string,char c1,char c2)
  2. {
  3.    char *c;
  4.    while( (c = strchr(string,c1))
  5.     {
  6.        *c = c2;
  7.        string = c + 1;
  8.     }
  9. }


 
C mieu là :D
 
En fait je recherche chaque occurence de c1 dans string (strchr)et je les remplace par c2 (*c = c2).
 
c est un pointeur vers le caractère trouvé par strchr.

Reply

Marsh Posté le 26-08-2002 à 16:10:16    

El_Gringo a écrit a écrit :

 
 
comment ça ça marche pas !??




 
En fait si, mais c optimisable.  :ange:  
Ouai bon ok je suis un peu dans le paté aujourd'hui.

Reply

Marsh Posté le 26-08-2002 à 16:12:59    

letoII a écrit a écrit :

 
 
En fait si, mais c optimisable.  :ange:  
Ouai bon ok je suis un peu dans le paté aujourd'hui.




 
Moi j'préférais ta 1ère version.
+ claire. + rapide aussi (1 affectation et une addition en + ds la 2e) ! En quoi tu la trouve + optimisée ta 2e version ?

Reply

Marsh Posté le 26-08-2002 à 16:13:16    

J'ai pas de compilo sous la main, ça marche ça ?:  
 

Code :
  1. void changechar(char *string,char c1,char c2) {
  2.     int i = 0;
  3.     while (string [i++] = string [i]==c1?c2:string [i]);
  4. }


 
Edit : inversion dans l'ordre de ?:


Message édité par kadreg le 26-08-2002 à 16:16:03

---------------
brisez les rêves des gens, il en restera toujours quelque chose...  -- laissez moi troller sur discu !
Reply

Marsh Posté le 26-08-2002 à 16:15:17    

kadreg a écrit a écrit :

J'ai pas de compilo sous la main, ça marche ça ?:  
 

Code :
  1. void changechar(char *string,char c1,char c2) {
  2.     int i = 0;
  3.     while (string [i++] = string [i]==c1?string [i]:c2);
  4. }






 
Je sais pas. c pas beau en tt cas !

Reply

Marsh Posté le 26-08-2002 à 16:15:57    

El_Gringo a écrit a écrit :

 
 
Moi j'préférais ta 1ère version.
+ claire. + rapide aussi (1 affectation et une addition en + ds la 2e) ! En quoi tu la trouve + optimisée ta 2e version ?




 
Ben ça évite de se retaper tout le début de la chaine à chaque fois, tu repart du caractère que tu vient de changer en gros. Si la chaine est longue tu y gagne à mon avis (surtout si t'as que quelque caractères à changer dedans).

Reply

Marsh Posté le 26-08-2002 à 16:16:22    

El_Gringo a écrit a écrit :

 
 
Je sais pas. c pas beau en tt cas !




 
+1 c archi moche

Reply

Marsh Posté le 26-08-2002 à 16:16:26    

je comprends pas le

Code :
  1. string = c + 1


 
pour remplacer les espaces par des underscores je fais donc

Code :
  1. changechar(machaine,' ','_');

?

Reply

Marsh Posté le 26-08-2002 à 16:17:14    

kadreg a écrit a écrit :

J'ai pas de compilo sous la main, ça marche ça ?:  
 

Code :
  1. void changechar(char *string,char c1,char c2) {
  2.     int i = 0;
  3.     while (string [i++] = string [i]==c1?c2:string [i]);
  4. }


 
Edit : inversion dans l'ordre de ?:




 :eek2:  
t'es un malade toi !!!  :heink:


---------------
J'ai un string dans l'array (Paris Hilton)
Reply

Marsh Posté le 26-08-2002 à 16:17:45    

ok c'est pour avancer le string = c + 1

Reply

Marsh Posté le 26-08-2002 à 16:17:55    

El_Gringo a écrit a écrit :

 
Je sais pas. c pas beau en tt cas !




 
T'aimes pas les opérateurs ternaires, ou c'est les boucles dans lesquelles la condition d'arret est "implicite" ?

Reply

Marsh Posté le 26-08-2002 à 16:17:56    

black_lord a écrit a écrit :

pour remplacer les espaces par des underscores je fais donc

Code :
  1. changechar(machaine,' ','_');

?




 
voilà
 

black_lord a écrit a écrit :

je comprends pas le

Code :
  1. string = c + 1






 
 
C simple je me place sur le caractère qui suit celui que j'ai remplacé, ça m'évite de reparcourir toute la chaîne depuis le début pour trouver le suivant.


Message édité par LetoII le 26-08-2002 à 16:18:36
Reply

Marsh Posté le 26-08-2002 à 16:19:13    

Merci beaucoup :)

Reply

Marsh Posté le 26-08-2002 à 16:19:13    

lorill a écrit a écrit :

 
T'aimes pas les opérateurs ternaires, ou c'est les boucles dans lesquelles la condition d'arret est "implicite" ?




 
Moi non, c'est deux choses que je m'interdit d'utiliser tellement ça rend le code pénible à lire.


---------------
brisez les rêves des gens, il en restera toujours quelque chose...  -- laissez moi troller sur discu !
Reply

Marsh Posté le 26-08-2002 à 16:19:29    

letoII a écrit a écrit :

 
 
Ben ça évite de se retaper tout le début de la chaine à chaque fois, tu repart du caractère que tu vient de changer en gros. Si la chaine est longue tu y gagne à mon avis (surtout si t'as que quelque caractères à changer dedans).




 
Ha ouais, j'y avait pas pensé tient...

Reply

Marsh Posté le 26-08-2002 à 16:20:54    

kadreg a écrit a écrit :

J'ai pas de compilo sous la main, ça marche ça ?:  
 

Code :
  1. void changechar(char *string,char c1,char c2) {
  2.     int i = 0;
  3.     while (string [i++] = (string [i]==c1?c2:string [i]));
  4. }


 
Edit : inversion dans l'ordre de ?:




 
Me semble plus correcte, et puis c assez moche quand même

Reply

Marsh Posté le 26-08-2002 à 16:21:04    

kadreg a écrit a écrit :

 
 
Moi non, c'est deux choses que je m'interdit d'utiliser tellement ça rend le code pénible à lire.




 
Mais !??? tu dis ça ? après ce que tu viens de ns poster !?
J'comprend lpus là !!

Reply

Marsh Posté le 26-08-2002 à 16:23:39    

lorill a écrit a écrit :

 
 
T'aimes pas les opérateurs ternaires, ou c'est les boucles dans lesquelles la condition d'arret est "implicite" ?




 
les opérateurs ternaire g rien contre, c obligé desfois (y a pas QUE "?:" comme opérateur ternaire.
Quand à celui là, il me parait un peu obsolète. il date du temps ou on cherchait avant tout à faire du code compacte.
Moi j'aime bien quand, dans un code, chaque ligne correspon à une opération simple...

Reply

Marsh Posté le 26-08-2002 à 16:24:06    

kadreg a écrit a écrit :

 
Moi non, c'est deux choses que je m'interdit d'utiliser tellement ça rend le code pénible à lire.




 
Pour les boucles je suis d'accord, par contre l'opérateur ternaire c'est bien(tm) quand c'est utilisé avec parcimonie...
 
Exemple :

Code :
  1. nom = (patronyme == null) ? marital : patronyme;

Reply

Marsh Posté le 26-08-2002 à 16:24:41    

El_Gringo a écrit a écrit :

 
y a pas QUE "?:" comme opérateur ternaire.




 
Il y a quoi d'autre ? Il m'a toujours semblé que c'était le seul.


---------------
brisez les rêves des gens, il en restera toujours quelque chose...  -- laissez moi troller sur discu !
Reply

Marsh Posté le 26-08-2002 à 16:25:16    

El_Gringo a écrit a écrit :

 
y a pas QUE "?:" comme opérateur ternaire.




 
C'est lesquels les autres ?
Note: ceci n'est pas un sarcasme, je cherche réellement a me renseigner
 
Edit: grillé


Message édité par lorill le 26-08-2002 à 16:25:38
Reply

Marsh Posté le 26-08-2002 à 16:26:14    

Arghh c'ets bizarre mais remplacer la chaine ne résoud pas le problème..
 
Je fais un :

Code :
  1. scanf("%s", &struct1.nom);
  2. changechar(struct1.nom,' ','_');


 
mais ca ne va pas... il prend l'espace et saute le scanf() suivant. Je comprends pas : je pensais que ça venait de l'espace.


Message édité par black_lord le 26-08-2002 à 16:26:33
Reply

Marsh Posté le 26-08-2002 à 16:27:02    

:??:


Message édité par LetoII le 26-08-2002 à 16:27:13
Reply

Marsh Posté le 26-08-2002 à 16:29:23    

Rhhooooo, c'est le scanf qui fait pas ce que tu attends. "%s" va prendre la chaine jusqu'au premier espace. Tu tape "toto tata", dans ta chaine tu auras "toto".
 
 
Regarde plutot du coté de getline.


---------------
brisez les rêves des gens, il en restera toujours quelque chose...  -- laissez moi troller sur discu !
Reply

Marsh Posté le 26-08-2002 à 16:30:51    

ou fgets

Reply

Marsh Posté le 26-08-2002 à 16:30:59    

tu veux voir le code plus en entier ?

Code :
  1. printf("Sous reseau : " );
  2. scanf("%s", &entree.ssreseau);
  3. changechar(entree.reseau,' ','_');
  4.        
  5. printf("Adresse IP : " );
  6. scanf("%s", &entree.ip);
  7. changechar(entree.reseau,' ','_');
  8.        
  9. printf("Adresse MAC : " );
  10. scanf("%s", &entree.mac);
  11. changechar(entree.reseau,' ','_');


 
Si je mets un espace dans la chaine pour le sous reseau alors il affiche Adresse IP mais sans rien me demander il demande Adresse MAC. Après verif entree.ip contient la partie après l'espace.

Reply

Marsh Posté le 26-08-2002 à 16:31:36    

D'accord
 
scanf() c'est ce qu'on m'avait appris en cours...

Reply

Marsh Posté le 26-08-2002 à 16:32:55    

black_lord a écrit a écrit :

D'accord
 
scanf() c'est ce qu'on m'avait appris en cours...




 
Normal, on se fait tous avoir au moin une fois :D

Reply

Marsh Posté le 26-08-2002 à 16:35:25    

fgets & getline c'est pour les fichiers non ? Le man me dit ça en tout cas

Code :
  1. getline(char **lineptr, size_t *n, FILE *stream);


Moi j'ai une entrée clavier...

Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

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