y'a t il une fonction C qui remplace la fonction c++ string.replace?

y'a t il une fonction C qui remplace la fonction c++ string.replace? - C - Programmation

Marsh Posté le 10-06-2005 à 11:50:42    

y'a t il une fonction en C qui remplace la fonction C++ string.replace?
 
 
si non
 
cmt faire pour remplacr N éléments a partir d'un Ième dans une chaine de caracteres en C


Message édité par fullnight le 10-06-2005 à 11:52:10
Reply

Marsh Posté le 10-06-2005 à 11:50:42   

Reply

Marsh Posté le 10-06-2005 à 11:57:00    

Non.
 
Mais l'algo est simple :
 

  • Chercher la chaîne à remplacer dans la chaîne initiale (strstr() par exemple)
  • Copier tout ce qui est avant dans une nouvelle chaîne (strcpy() )
  • Ajouter à la nouvelle chaîne le remplacement (strcat() )
  • Copier tout ce qui suit la chaîne à remplacer dans la nouvelle chaîne (re strcat() )
  • Remplacer la chaîne initiale par la nouvelle chaîne


 
 
En faisant attention aux allocations mémoire qui vont bien.


Message édité par Elmoricq le 10-06-2005 à 11:57:17
Reply

Marsh Posté le 10-06-2005 à 11:59:20    

c'est a dire que je n'ai pas de chaine a remplacer dans la chaine initiale.
 
 
 
je veux dire par ex j'ai une chaine avec 10 caracteres + 1\0
 
je voudrais me positionner au car 5 et virer les 5 qui suivent
 
voila ce que je veux dire

Reply

Marsh Posté le 10-06-2005 à 12:01:17    

Tu mets le 6e caractère à '\0', ce qui "terminera" la chaîne plus tôt et ne conservera que les 5 premiers caractères ;)

Reply

Marsh Posté le 10-06-2005 à 12:04:35    

mais si tu veux pas le faire depuis le début il faut copier dans une autre chaine

Reply

Marsh Posté le 10-06-2005 à 12:07:04    

il parait que les chaines littérales sont constantes, donc pas moyen de les changer.
 
pq ici on peut? ce sont pas des chaines littérales?

Reply

Marsh Posté le 10-06-2005 à 12:07:35    

ritzle a écrit :

mais si tu veux pas le faire depuis le début il faut copier dans une autre chaine


 
Pour ne conserver qu'une partie d'une chaîne, où qu'elle soit, ce serait pas plus simple d'utiliser memmove() (+ utilisation du '\0' où il faut), que de passer par une chaîne temporaire ?
 
Rapport aux allocations mémoire qu'on n'aurait pas à gérer, du coup ?

Reply

Marsh Posté le 10-06-2005 à 12:08:45    

fullnight a écrit :

il parait que les chaines littérales sont constantes, donc pas moyen de les changer.
 
pq ici on peut? ce sont pas des chaines littérales?


 
Ben on sait pas, tu ne nous avais jamais dit qu'il s'agissait de constantes.
 
Par définition, une constante ben... c'est une constante, donc ça ne se modifie pas.
Là, pas d'autre choix que de passer par une chaîne temporaire.

Reply

Marsh Posté le 10-06-2005 à 12:10:50    

j'ai parlé de chaine de caractere
 
donc genre char * chaine="bonjour";
 
c'est modifiable ca?

Reply

Marsh Posté le 10-06-2005 à 12:12:06    

Elmoricq a écrit :

Ben on sait pas, tu ne nous avais jamais dit qu'il s'agissait de constantes.
 
Par définition, une constante ben... c'est une constante, donc ça ne se modifie pas.
Là, pas d'autre choix que de passer par une chaîne temporaire.


char string[] = "salut !";
c'est pas une constante,
char *string = "salut !";
mais ca si

Reply

Marsh Posté le 10-06-2005 à 12:12:06   

Reply

Marsh Posté le 10-06-2005 à 12:12:23    

aahh ok !!
merci

Reply

Marsh Posté le 10-06-2005 à 12:18:29    

maintenant pour modifier char string[] = "salut !";  
 
j voudrais enlever le l et le u
j fais quoi?

Reply

Marsh Posté le 10-06-2005 à 12:45:03    

vous parlez tous de constante là, mais je vois aucun const devant vos déclarations de char* hein ! faudrait voir à être rigoureux jusqu'au bout [:mlc]


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

Marsh Posté le 10-06-2005 à 12:46:09    

fullnight a écrit :

maintenant pour modifier char string[] = "salut !";  
 
j voudrais enlever le l et le u
j fais quoi?


tu créé un tableau de 6 caractères, tu parcours ton tableau string en recopiant les caractères un par un, sauf le l et le u. ne pas oublier le '\0' final


Message édité par Harkonnen le 10-06-2005 à 12:46:32

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

Marsh Posté le 10-06-2005 à 14:10:44    

fullnight a écrit :

cmt faire pour remplacr N éléments a partir d'un Ième dans une chaine de caracteres en C


Si la chaine est modifiable, memcpy().
 


---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
Reply

Marsh Posté le 10-06-2005 à 14:12:28    

fullnight a écrit :

je veux dire par ex j'ai une chaine avec 10 caracteres + 1\0
 
je voudrais me positionner au car 5 et virer les 5 qui suivent


Si la chaine est modifiable :  


   s[5] = 0;



---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
Reply

Marsh Posté le 10-06-2005 à 14:15:08    

fullnight a écrit :

il parait que les chaines littérales sont constantes, donc pas moyen de les changer.
 
pq ici on peut? ce sont pas des chaines littérales?


Tu n'a pas précisé la nature de la chaine originale.


/* pointeur sur chaine litterale : la chaine est non modifiable */
char *s = "hello";
/* ou mieux (evite les embrouilles) */
char const *s = "hello";
 
/* tableau de char initialise : le tableau est modifiable */
char s[] = "hello";


---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
Reply

Marsh Posté le 10-06-2005 à 14:28:44    

fullnight a écrit :

j'ai parlé de chaine de caractere
 
donc genre char * chaine="bonjour";
 
c'est modifiable ca?


Non.


char chaine[] = "bonjour";


est modifiable.


---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
Reply

Marsh Posté le 11-06-2005 à 08:33:48    

Question : le compilo bronche ou pas, si on tente de modifier char *s ="hello" ?
Si on met const devant, je suuis sûr que oui, mais sinon ?

Reply

Marsh Posté le 11-06-2005 à 09:47:08    

el muchacho a écrit :

Question : le compilo bronche ou pas, si on tente de modifier char *s ="hello" ?
Si on met const devant, je suuis sûr que oui, mais sinon ?


Non. C'est une faiblesse bien connue du C. Il est recommandé de définir les pointeurs sur chaines 'const'.


---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
Reply

Marsh Posté le 11-06-2005 à 11:08:49    

Déjà ça dépend de la machine, de la façon dont sont stocké les données, etc
Mais en plus considérons cette boucle :

for (;;)
{
  char *chaine = "salut\n";
  puts(chaine);
  chaine[2] = 0;
  ...
}


Que va-t'il afficher la 2e fois ? (si le compilateur l'accepte bien sûr)

Reply

Marsh Posté le 11-06-2005 à 11:22:55    

Tarabiscote a écrit :

Déjà ça dépend de la machine, de la façon dont sont stocké les données, etc
Mais en plus considérons cette boucle :

for (;;)
{
  char *chaine = "salut\n";
  puts(chaine);
  chaine[2] = 0;
  ...
}


Que va-t'il afficher la 2e fois ? (si le compilateur l'accepte bien sûr)


Crash...
http://mapage.noos.fr/emdel/gif/crash.gif


Message édité par Emmanuel Delahaye le 11-06-2005 à 11:25:31

---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
Reply

Marsh Posté le 11-06-2005 à 11:26:59    

Voilà, c'est ce que je voulais dire, le résultat est totalement imprévisible, ca peut aller de "ça a l'air de marcher" à "ça crash completement".

Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

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