Supprimer une fin de chaine

Le
stéphane SARAGAGLIA
Bonjour à tous,

Qu'y a-t-il de plus élégant/simple/rapide pour supprimer une fin de
chaine que ce qui suit ?

std::string MaChaine = "TOTOx0Dx0A"
MaChaine.replace(4, MaChaine.size()-1, "");
Vidéos High-Tech et Jeu Vidéo
Téléchargements
Vos réponses
Gagnez chaque mois un abonnement Premium avec GNT : Inscrivez-vous !
Trier par : date / pertinence
Cyrille
Le #7057121
stéphane SARAGAGLIA a écrit :
Bonjour à tous,

Qu'y a-t-il de plus élégant/simple/rapide pour supprimer une fin de
chaine que ce qui suit ?

std::string MaChaine = "TOTOx0Dx0A"
MaChaine.replace(4, MaChaine.size()-1, "");



std::string::resize(size_t n);
Stan
Le #7067971
On 20 juin, 18:50, stéphane SARAGAGLIA
Bonjour à tous,

Qu'y a-t-il de plus élégant/simple/rapide pour supprimer une fin de
chaine que ce qui suit ?

std::string MaChaine = "TOTOx0Dx0A"
MaChaine.replace(4, MaChaine.size()-1, "");



Attention, string::replace possède deux types d'arguments
différents :
soit un size_type ou bien un itérator.

Dans le cas ci-dessus, vous remplacez de la position 4 sur n
caractères ( ici 5 ).
C'est douteux.

Le mieux est de faire
MaChaine.replace( MaChaine.find("rn"), 2, ""); // supprime CR + LF

qui a l'avantage de fonctionner même si la séquence recherchée n'est
pas à la fin.

Si vraiment la vitesse est un critère déterminant, il y a
MaChaine.resize(MaChaine.length()-2);

mais il faut être sûr que le CR LF soit réellement présent...

--
-Stan
Fabien LE LEZ
Le #7071911
On Fri, 20 Jun 2008 18:50:12 +0200, stéphane SARAGAGLIA :

Qu'y a-t-il de plus élégant/simple/rapide pour supprimer une fin de
chaine que ce qui suit ?

std::string MaChaine = "TOTOx0Dx0A"



Ici, tu veux enlever l'indicateur de fin de ligne (CRLF, rn).
En pratique, tu risques de tomber sur des cas où l'indicateur de fin
de ligne est simplement n ; aussi, je te conseille de gérer tous les
cas d'un coup :

#include <string>
#include
size_t ChercheCRLF (std::string const& s)
{
size_t reponse= s.find ('n');
if (reponse != std::string::npos)
{
while (reponse>0 && s[reponse-1]=='r')
{
--reponse;
}
}
return reponse;
}

void SupprimeCRLF (std::string& s)
{
size_t const pos= ChercheCRLF (s);
if (pos != std::string::npos)
{
s.resize (pos);
}
}

std::string ChaineSansCRLF (std::string const& s)
{
size_t const pos= ChercheCRLF (s);
if (pos != std::string::npos)
{
return s.substr (0, pos);
}
else
{
return s;
}
}

(Note : typiquement, on n'a qu'un seul 'r'. On pourrait donc
remplacer "while" par "if". Mais bon, le while ne coûte pas cher et
évite certains cas bizarres, comme un fichier converti deux fois de
Unix vers Windows.)
Publicité
Poster une réponse
Anonyme