Quel est le moyen le plus efficace de supprimer une 'nouvelle ligne' d'un std :: string?
#include <algorithm>
#include <string>
std::string str;
str.erase(std::remove(str.begin(), str.end(), '\n'), str.end());
Le comportement de std :: remove peut ne pas correspondre à vos attentes. Voir une explication de celle-ci ici .
Si la nouvelle ligne est censée être à la fin de la chaîne, alors:
if (!s.empty() && s[s.length()-1] == '\n') {
s.erase(s.length()-1);
}
Si la chaîne peut contenir plusieurs nouvelles lignes n'importe où dans la chaîne:
std::string::size_type i = 0;
while (i < s.length()) {
i = s.find('\n', i);
if (i == std::string:npos) {
break;
}
s.erase(i);
}
Vous devriez utiliser l'idiome erase-remove , en recherchant '\n'
. Cela fonctionnera pour tout conteneur de séquence standard; pas seulement string
.
En voici une pour la nouvelle ligne DOS ou Unix:
void chomp( string &s)
{
int pos;
if((pos=s.find('\n')) != string::npos)
s.erase(pos);
}
s.erase(std::remove(s.begin(), s.end(), '\n'), s.end());
Le code supprime tous les nouvelles lignes de la chaîne str
.
La mise en œuvre O (N) est mieux servie sans commentaires sur SO et avec commentaires en production.
unsigned shift=0;
for (unsigned i=0; i<length(str); ++i){
if (str[i] == '\n') {
++shift;
}else{
str[i-shift] = str[i];
}
}
str.resize(str.length() - shift);
Une autre façon de le faire dans la boucle for
void rm_nl(string &s) {
for (int p = s.find("\n"); p != (int) string::npos; p = s.find("\n"))
s.erase(p,1);
}
Usage:
string data = "\naaa\nbbb\nccc\nddd\n";
rm_nl(data);
cout << data; // data = aaabbbcccddd
À propos de la réponse 3 en supprimant uniquement le dernier code de chaîne:\n:
if (!s.empty() && s[s.length()-1] == '\n') {
s.erase(s.length()-1);
}
La condition if n'échouera-t-elle pas si la chaîne est vraiment vide?
Ne vaut-il pas mieux faire:
if (!s.empty())
{
if (s[s.length()-1] == '\n')
s.erase(s.length()-1);
}
Si c'est n'importe où dans la chaîne que vous ne pouvez pas faire mieux que O (n).
Et le seul moyen est de rechercher '\ n' dans la chaîne et de l’effacer.
for(int i=0;i<s.length();i++) if(s[i]=='\n') s.erase(s.begin()+i);
Pour plus de nouvelles lignes que:
int n=0;
for(int i=0;i<s.length();i++){
if(s[i]=='\n'){
n++;//we increase the number of newlines we have found so far
}else{
s[i-n]=s[i];
}
}
s.resize(s.length()-n);//to delete only once the last n elements witch are now newlines
Il efface toutes les nouvelles lignes une fois.
Utilisez std :: algorithmes. Cette question contient des suggestions réutilisables/ Supprime les espaces de std :: string en C++
std::string some_str = SOME_VAL;
if ( some_str.size() > 0 && some_str[some_str.length()-1] == '\n' )
some_str.resize( some_str.length()-1 );
ou (supprime plusieurs nouvelles lignes à la fin)
some_str.resize( some_str.find_last_not_of(L"\n")+1 );