Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Supprimer une fin de chaine

3 réponses
Avatar
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 = "TOTO\x0D\x0A"
MaChaine.replace(4, MaChaine.size()-1, "");

3 réponses

Avatar
Cyrille
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);
Avatar
Stan
On 20 juin, 18:50, stéphane SARAGAGLIA
wrote:
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
Avatar
Fabien LE LEZ
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 <stdlib.h>

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