remplacer un caractère dans une chaine - C++ - Programmation
Marsh Posté le 11-06-2012 à 11:41:15
EN C: 
C'est pas possible uniquement si tu déclares ceci: 
char * toto = "abcd"; 
car c'est en principe alors une chaîne constante allouée à la compilation (mais certains compilos acceptent néanmoins les modifs en place dans les chaines déclarées ainsi). 
 
Il te suffit de faire une allocation dynamique: 
char * toto = malloc (strlen("abcd" )+1); 
strcat(toto, "abcd" ); 
[ou si tu disposes de strdup, le tout en une seule ligne: char * toto = strdup("abcd" );] 
ET de ne pas oublier de faire un free quand la chaine allouée n'est plus nécessaire. 
 
En C++: 
std::string toto = "abcd"; 
ta string C++ est modifiable, par contre la méthode data retourne un tableau de caractères qui ne peuvent pas être modifiés 
 
A+,
Marsh Posté le 11-06-2012 à 11:52:07
| in_your_phion a écrit : hello, il me semble que le remplacement d'un caractère dans une chaine type C-string n'est pas possible ou du moins produit un comportement indésiré, par exemple : 
 Ceci est possible ? | 
| Code : 
 | 
(note 'C' et pas "C" )
Le probleme est
| Code : 
 | 
qu'il serait plus sense d'ecrire
| Code : 
 | 
mais est admis pour des raisons de compatibilite. Si tu as dans toto un pointeur vers une zone dans laquelle tu peux ecrire (voir la reponse de Gilou), il n'y a pas de probleme.
| Citation : 
 
 | 
A nouveau
| Code : 
 | 
mais
| Code : 
 | 
 devrait fonctionner.
Marsh Posté le 11-06-2012 à 11:55:50
Je suis pas sur que ça fonctionne sur p vu la spec de data (mais il peut modifier directement toto):
| Citation : string::data  | 
 
Mon impression est que la spec veut que seul les membres de la classe string modifient le contenu d'une string et pas du code C avec un tableau de caractères pointant sur la même zone (ou une zone privée maintenue par l'objet). 
A+,
Marsh Posté le 11-06-2012 à 12:40:48
| gilou a écrit : Je suis pas sur que ça fonctionne sur p vu la spec de data (mais il peut modifier directement toto): 
 
 | 
salut,
merci pour vos réponses ! j'ai corrigé les ""
en fait, j'ai une fonction où je reçois une string constante (imposé) et je voudrais la modifier, donc au lieu d'utiliser la méthode replace de std::string, j'ai essayé avec data()... ça a l'air de marcher mais c'est vrai que c'est bien crado  ![[:tinostar] [:tinostar]](https://forum-images.hardware.fr/images/perso/tinostar.gif) 
 
Marsh Posté le 11-06-2012 à 12:44:41
| Citation : en fait, j'ai une fonction où je reçois une string constante (imposé) et je voudrais la modifier | 
 ![[:black_jack] [:black_jack]](https://forum-images.hardware.fr/images/perso/black_jack.gif) 
  
Modifies en une copie pas constante. 
A+,
Marsh Posté le 11-06-2012 à 12:49:26
| gilou a écrit : Je suis pas sur que ça fonctionne sur p vu la spec de data (mais il peut modifier directement toto): 
   | 
 
 
Il y a eu des changement en C++11 (suivant la pratique existante, maintenant la norme demande que data() + i == &operator[](i) for each i in [0,size()]), mais pas sur le fait qu'il n'y a qu'un membre data qui est const et retourne un char const* (donc l'assignation doit foirer a la compilation). Il me semblait qu'il avait ete question d'ajouter un data() non const retournant un pointeur non const, mais soit je me goure, soit il n'est pas passe (&toto[0] ayant l'effet desire, c'est pas une perte).
Marsh Posté le 11-06-2012 à 21:40:19
| gilou a écrit : 
   | 
 
 
salut, 
oui je pourrais faire cela, mais c'est une fonction qui log sans arrêt et je voulais justement éviter de faire une copie^^ 
 
merci pour vos réponses en tous cas !
Marsh Posté le 12-06-2012 à 16:43:11
on ne charcute pas un const T comme ça. Fais une copie point, le copilo optimiseras.
Marsh Posté le 11-06-2012 à 10:24:07
hello,
il me semble que le remplacement d'un caractère dans une chaine type C-string n'est pas possible ou du moins produit un comportement indésiré, par exemple :
Ceci est possible ?
Par ailleurs, est ce qu'on a la même limitation avec les strings ? i.e. :
?
si aucune des deux solutions n'est possible, comment on fait ?
merci par avance
Message édité par in_your_phion le 11-06-2012 à 12:36:51