remplacer un caractère dans une chaine

remplacer un caractère dans une chaine - C++ - Programmation

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 :
 

Code :
  1. char * toto = "abcd";
  2. *(toto + 2) = 'C' ; //replacement de 'c'


 
Ceci est possible ?
 
Par ailleurs, est ce qu'on a la même limitation avec les strings ? i.e. :
 

Code :
  1. std::string toto = "abcd";
  2. char * p = toto.data();
  3. *(p+2) = 'C';


 
?
 
si aucune des deux solutions n'est possible, comment on fait ?  [:tinostar] on est obligé de copier toute la string pour la modifier ??
 
merci par avance

Message cité 1 fois
Message édité par in_your_phion le 11-06-2012 à 12:36:51
Reply

Marsh Posté le 11-06-2012 à 10:24:07   

Reply

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+,


Message édité par gilou le 11-06-2012 à 11:52:12

---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
Reply

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 :

 
Code :
  1. char * toto = "abcd";
  2. *(toto + 2) = "C" ; //replacement de 'c'
 

Ceci est possible ?

 
Code :
  1. toto[2] = 'C';
 

(note 'C' et pas "C" )

 

Le probleme est

Code :
  1. char * toto = "abcd";


qu'il serait plus sense d'ecrire

Code :
  1. char const* toto = "abcd";


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 :


Par ailleurs, est ce qu'on a la même limitation avec les strings ? i.e. :

 
Code :
  1. std::string toto = "abcd";
  2. char * p = toto.data();
  3. *(p+2) = "C";



 

A nouveau

Code :
  1. toto[2]='C';
 

mais

Code :
  1. p[2]='C';

devrait fonctionner.


Message édité par Un Programmeur le 11-06-2012 à 11:53:42

---------------
The truth is rarely pure and never simple (Oscar Wilde)
Reply

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
const char* data() const;
Get string data
Returns a pointer to an array of characters with the same content as the string.
 
Notice that no terminating null character is appended (see member c_str for such a functionality).
 
The returned array points to an internal location which should not be modified directly in the program. Its contents are guaranteed to remain unchanged only until the next call to a non-constant member function of the string object.


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+,

Message cité 2 fois
Message édité par gilou le 11-06-2012 à 12:01:21

---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
Reply

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):

Citation :

string::data
const char* data() const;
Get string data
Returns a pointer to an array of characters with the same content as the string.

 

Notice that no terminating null character is appended (see member c_str for such a functionality).

 

The returned array points to an internal location which should not be modified directly in the program. Its contents are guaranteed to remain unchanged only until the next call to a non-constant member function of the string object.


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+,

 


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]


Message édité par in_your_phion le 11-06-2012 à 12:41:21
Reply

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]  
Modifies en une copie pas constante.
A+,


---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
Reply

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):

Citation :

string::data
const char* data() const;
Get string data
Returns a pointer to an array of characters with the same content as the string.
 
Notice that no terminating null character is appended (see member c_str for such a functionality).
 
The returned array points to an internal location which should not be modified directly in the program. Its contents are guaranteed to remain unchanged only until the next call to a non-constant member function of the string object.


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+,


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


---------------
The truth is rarely pure and never simple (Oscar Wilde)
Reply

Marsh Posté le 11-06-2012 à 21:40:19    

gilou a écrit :

Citation :

en fait, j'ai une fonction où je reçois une string constante (imposé) et je voudrais la modifier

[:black_jack]  
Modifies en une copie pas constante.
A+,


 
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 !

Reply

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.

Reply

Sujets relatifs:

Leave a Replay

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