Quel est le moyen le plus efficace de supprimer une 'nouvelle ligne' d'une chaîne std :: string?C++ Supprimer une nouvelle ligne de la chaîne multiligne
Répondre
#include <algorithm>
#include <string>
std::string str;
str.erase(std::remove(str.begin(), str.end(), '\n'), str.end());
Le comportement de std :: remove ne peut pas être tout à fait ce que vous attendez. Voir une explication here.
S'il y a une chance de nouvelles lignes d'autres plates-formes, peut-être supprimer les caractères '\ r' aussi. Un deuxième appel à effacer et std :: remove etc n'est pas un gros problème de performance. Les alternatives, telles que l'utilisation de std :: remove_if avec une fonction de prédicat, seront probablement plus lentes. – Steve314
Si vos données ont été chargées à partir d'un fichier ouvert en mode texte (ascii, non-binaire), je crois qu'il convertit automatiquement toutes les conventions de nouvelle ligne en un simple «\ n». Je cherche une référence définitive pour corroborer. – luke
http://msdn.microsoft.com/en-us/library/kt0etdcs%28VS.71%29.aspx - c'est pour fread(), mais je crois que les lectures et les écritures d'iostream ont le même comportement. – luke
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 que les nouvelles lignes:
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 tous les sauts de ligne une fois.
Cette implémentation ne gérera pas correctement les retours à la ligne consécutifs, puisque 'i' est incrémenté indépendamment du fait qu'un élément soit effacé. –
Je viens de remarquer, je vais éditer ce – csiz
Si la nouvelle ligne devrait être à la fin de la chaîne, puis:
if (!s.empty() && s[s.length()-1] == '\n') {
s.erase(s.length()-1);
}
Si la chaîne peut contenir plusieurs sauts de ligne ne 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);
}
Première version parfaite. La deuxième version serait plus facile à utiliser std :: erase (std :: removr (XXX)) –
Je n'ai jamais été très à l'aise avec la sémantique de remove() et je dois toujours la rechercher parce que ce n'est pas évident. Ma mise en œuvre ci-dessus est simple et directe, mais pas la plus efficace. Si l'efficacité est importante, une solution légèrement différente est nécessaire. –
la question était, "quel est le moyen le plus efficace ...", donc je suppose que l'efficacité est importante;) – Pieter
Vous devez utiliser la erase-remove idiom, à la recherche de '\n'
. Cela fonctionnera pour n'importe quel conteneur de séquence standard; pas seulement string
.
Utilise les algorithmes std ::. Cette question a des suggestions convenablement réutilisables Remove spaces from std::string in C++
s.erase(std::remove(s.begin(), s.end(), '\n'), s.end());
Le code supprime tous la chaîne de nouvelles lignes str
.
O (N) implémentation mieux servi 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);
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 sauts de ligne à la fin)
some_str.resize(some_str.find_last_not_of(L"\n")+1);
Toutes ces réponses semblent un peu lourd pour moi.
Si vous supprimez simplement le '\ n' et déplacez tout le reste, vous risquez d'avoir des personnages claqués ensemble d'une manière bizarre. Alors pourquoi ne pas simplement faire la chose la plus simple (et la plus efficace): Remplacer tous les \ n par des espaces?
for (int i = 0; i < str.length();i++) {
if (str[i] == '\n') {
str[i] = ' ';
}
}
Il peut y avoir des moyens d'améliorer la vitesse de ce sur les bords, mais il sera beaucoup plus rapide que des morceaux entiers de déplacer la chaîne autour de la mémoire.
Voici un pour la nouvelle ligne DOS ou Unix:
void chomp(string &s)
{
int pos;
if((pos=s.find('\n')) != string::npos)
s.erase(pos);
}
Changez le' if' en boucle while et vous avez une bonne solution. – CaptainBli
Une autre façon de le faire dans la boucle
void rm_nl(string &s) {
for (int p = s.find("\n"); p != (int) string::npos; p = s.find("\n"))
s.erase(p,1);
}
Utilisation:
string data = "\naaa\nbbb\nccc\nddd\n";
rm_nl(data);
cout << data; // data = aaabbbcccddd
A propos de réponse 3 supprimant uniquement le dernier code de chaîne \ n:
if (!s.empty() && s[s.length()-1] == '\n') {
s.erase(s.length()-1);
}
Est-ce que la condition if n'échoue pas si la chaîne est vraiment vide?
est-il pas mieux à faire:
if (!s.empty())
{
if (s[s.length()-1] == '\n')
s.erase(s.length()-1);
}
- 1. Comment écrire une nouvelle ligne dans une chaîne dans ColdFusion?
- 2. Supprimer un caractère de nouvelle ligne de la première ligne de NSString
- 3. indentation d'une chaîne multiligne
- 4. supprimer une nouvelle ligne lors de l'envoi de la requête au serveur via Ajax Post avec JQuery
- 5. PHP longue chaîne sans nouvelle ligne
- 6. C#: Bouclage à travers les lignes d'une chaîne multiligne
- 7. TextBox multiligne ne pas afficher la ligne
- 8. Suppression du retour chariot et de la nouvelle ligne à partir de la fin d'une chaîne dans C#
- 9. Comment faire une boucle sur une chaîne multiligne dans Ruby?
- 10. Supprimer la dernière ligne Databound DataGridView C#
- 11. Regex qui correspond à une nouvelle ligne (\ n) en C#
- 12. Smalltalk, caractère de nouvelle ligne
- 13. Comment mettre une nouvelle ligne à l'intérieur d'une chaîne dans le code source C#?
- 14. Ligne actuelle dans une zone de texte multiligne
- 15. Multiligne NSTokenField et la touche de retour
- 16. Supprimer une ligne de gridview
- 17. Nouvelle ligne dans la notification C# (Compact Framework)
- 18. Supprimer la ligne DataGridView
- 19. Supprimer la ligne sélectionnée d'un DataGridView
- 20. C++: Supprimer tout le formatage HTML de la chaîne?
- 21. Quelle est la méthode canonique pour couper une chaîne dans Ruby sans créer une nouvelle chaîne?
- 22. Supprimer les commentaires JavaScript de la chaîne avec C#
- 23. Recherche d'une nouvelle position de ligne dans une variable de chaîne VB.NET en utilisant InStr
- 24. BASH: caractère de nouvelle ligne bande de chaîne (lecture en ligne)
- 25. Supprimer une ligne dans Eclipse
- 26. Faire une nouvelle ligne dans un GridView
- 27. Comment ne prendre que la première ligne du texte multiligne
- 28. Linux ligne de commande: diviser une chaîne
- 29. C#: supprimer une ligne dans un fichier Txt
- 30. UITextAssocier du texte à la nouvelle ligne
est le saut de ligne devrait être dans un endroit particulier, comme à la fin de la chaîne? –
non; cela pourrait être n'importe où – shergill