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
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 |
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 ? on est obligé de copier toute la string pour la modifier ??
merci par avance
Message édité par in_your_phion le 11-06-2012 à 12:36:51