Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1031 connectés 

  FORUM HardWare.fr
  Programmation
  C++

  remplacer un caractère dans une chaine

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

remplacer un caractère dans une chaine

n°2145307
in_your_ph​ion
Posté le 11-06-2012 à 10:24:07  profilanswer
 

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
mood
Publicité
Posté le 11-06-2012 à 10:24:07  profilanswer
 

n°2145312
gilou
Modérateur
Modzilla
Posté le 11-06-2012 à 11:41:15  profilanswer
 

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é!  --
n°2145315
Un Program​meur
Posté le 11-06-2012 à 11:52:07  profilanswer
 

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)
n°2145316
gilou
Modérateur
Modzilla
Posté le 11-06-2012 à 11:55:50  profilanswer
 

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é!  --
n°2145317
in_your_ph​ion
Posté le 11-06-2012 à 12:40:48  profilanswer
 

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
n°2145318
gilou
Modérateur
Modzilla
Posté le 11-06-2012 à 12:44:41  profilanswer
 

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é!  --
n°2145319
Un Program​meur
Posté le 11-06-2012 à 12:49:26  profilanswer
 

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)
n°2145383
in_your_ph​ion
Posté le 11-06-2012 à 21:40:19  profilanswer
 

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 !

n°2145552
Joel F
Real men use unique_ptr
Posté le 12-06-2012 à 16:43:11  profilanswer
 

on ne charcute pas un const T comme ça. Fais une copie point, le copilo optimiseras.


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C++

  remplacer un caractère dans une chaine

 

Sujets relatifs
[Débutant] Module Turtle et TkinterRemplacer la nième occurence d'une chaine de caractère par ...
XSL : remplacer une chaine de caractèreRemplacer une chaine de caractère par une autre dans du texte
remplacer une chaine de caractere dans un fichier en .batremplacer une chaine de caractère dans un fichier
[php] Patern, remplacer dans une chaine de caractèreRemplacer le caractere " \ " par " \\" dans une chaine.....
[DOS] Remplacer une chaine de caractereProgramme pour remplacer une chaine de caractere dans un fichier
Plus de sujets relatifs à : remplacer un caractère dans une chaine


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR