2017-06-19 16 views
0

Je voudrais supprimer une ligne vide dans une grande chaîne (pas un fichier). Ce est la chaîne:Supprimer une ligne vide dans une grande chaîne

The unique begin of a line in my string, after that a content same endline 


     The unique begin of a line in my string, after that a content same endline 
     The unique begin of a line in my string, after that a content same endline 

Voici comment il apparaît dans notepad ++:

Notepad

+2

INITIALISATION jamais 'OldCaractere',' NumberReturnCaractere', 'NumberDoubleReturnCaractere' ils contiennent des ordures. – VTT

+0

Pourquoi ne pas utiliser strstr pour trouver \ n \ n ou quelque chose comme ça? – ArBel

+0

Comme vous avez cette exigence pouvez-vous changer votre conception pour être un 'std :: vecteur >' ou 'std :: liste >' où chaque élément dans le conteneur externe est une ligne du texte original? –

Répondre

0

La solution:

string myString = "The string which contains double \r\n \r\n so it will be removed with this algorithm."; 
int myIndex = 0; 
while (myIndex < myString.length()) { 
    if (myString[myIndex] == '\n') { 
    myIndex++; 
    while (myIndex < myString.length() && (myString[myIndex] == ' ' || myString[myIndex] == '\t' || myString[myIndex] == '\r' || myString[myIndex] == '\n')) { 
     myString.erase(myIndex, 1); 
    } 
    } else { 
    myIndex++; 
    } 
} 
+0

Ce code contient plusieurs bogues: 1) comparaison des types de données signés et non signés. 2) il enlève non seulement les lignes vides, mais aussi tous les caractères d'espaces depuis le début de la ligne suivant la ligne vide. 3) si vous attendez de longues chaînes avec beaucoup de lignes vides, alors vous aurez beaucoup d'appels 'erase()' qui déplacent la chaîne et ainsi votre performance en souffrira. –

3

Utiliser l'expression régulière. Le lien suivant vers regex reference devrait vous aider à démarrer. Ou encore mieux regex_replace.

Votre expression régulière ressemblera à ceci

/\n\s*\n/ 

Pour les tests d'expression régulière pourrait être utile en ligne regex tester.

#include <iostream> 
#include <string> 
#include <regex> 

int main() 
{ 
    std::string s ("there is a line \n \nanother line\n \nand last one in the string\n"); 
    std::regex e ("\\n\\s*\\n"); 
    std::cout << std::regex_replace (s,e,"\n"); 
    return 0; 
} 
+0

Bonjour, merci pour votre réponse, je ne comprends pas comment l'utiliser dans mon cas, pouvez-vous me donner un code de travail? – Anonyme

+0

Voir l'exemple dans mon message édité. J'ai également changé la référence à regex_replace au lieu de regex_search que j'ai utilisé à l'origine. –