String bearbeiten (Leerzeichen bzw Zeilenumbruch entfernen)



  • naja das is ja noch einfacher:

    string dein_string="abc def ghi";
    string neu;
    
    for(int a=0;a<dein_string.length();a++)
    {
    if(dein_string[a]!=' '&&dein_string[a]!='\n')
    {
    neu[a]=dein_string[a];
    }
    }
    

    damit schreibste jedes zeichen deines strings das kein leerzeichen oder zeilenumbruch ist in einen neuen string den du dann in die datei schreiben kannst.

    d.h. zuerst tust du das was du von leerzeichen und zeilenumbrüchen befreien willst in dein_string, dann speicherst du einfach neu per ofstream in die textdatei. so befreit man den string von leerzeichen und so.
    mfg,
    andi01.



  • @andi01: was steht in neu?

    @leon22: Der Code von Gilder funktioniert einwandfrei. Du solltest mal deinen kompletten Versuch zeigen. Denn irgendwie erzählst du etwas und dein Code macht was anderes...



  • hatte einfach die rehenfolge vertauscht, jetzt stimmt der code oben, habs ausgebessert 😃

    edit: habs jetzt geschafft, code steht auf der nächsten seite!

    mfg,
    andi01.



  • andi01 schrieb:

    jetzt sollte es aber funktionieren 🙂

    Nein.
    Der Index in neu ist ja nicht immer gleich vom alten string. (gleich oder kleiner. Aber du kannst das Zeichen ja einfach anfügen...)

    Zudem ist es bei solchen Sachen (erstrecht wenn man sich nicht 110% sicher ist) sinnvoll, einfach ein kleines Testprogramm zu schreiben und es selber auszuprobieren. Bevor man es postet 😉



  • jo hab ich auch grade beim testen gemerkt, ich versuche mal den fehler noch zu beheben.



  • juhu, geschafft:
    der code funktioniert!!!

    #include<iostream>
    #include<windows.h>
    #include<conio.h>
    #include<fstream>
    #include<string>
    using namespace std;
    
    int main()
    {
    string dein_string="abc\n def ghi"; 
    string neu; 
    
    for(int a=0;a<11;a++) 
    { 
    	if((dein_string[a]!=' ')&&(dein_string[a]!='\n')) 
    	{ 
    	neu+=dein_string[a]; 
    	}
    }
    

    mfg,
    andi01.



  • #include <algorithm>
    #include <string>
    
    template<typename TChar>
    void trim_string(std::basic_string<TChar> &str, TChar to_trim)
    {
    	typedef std::basic_string<TChar> this_string;
    
    	this_string::iterator end=str.end();
    	end = std::remove( str.begin(), end, to_trim );
    	this_string::size_type new_length = this_string::size_type(std::distance(str.begin(), end));
    	str.resize(new_length);
    }
    
    int main()
    {
    	std::string x = "asdkjasd asjhd asdasd a d d f ";
    	trim_string(x, ' ');
    	trim_string(x, 'a');
    	trim_string(x, 'k');
    }
    

    bb



  • unskilled schrieb:

    this_string::size_type(std::distance(str.begin(), end));
    

    Da fehlt 'n typename.
    Ich liefer auch mal einen Vorschlag ab:

    template<typename Container>
    void remove(Container& c, const typename Container::value_type& value)
    {
        c.erase(std::remove(c.begin(), c.end(), value), c.end());
    }
    


  • Guter Vorschlag, Ryuzaki!

    Statt const value_type& kannst du allerdings direkt const_reference nehmen.



  • hmm... ok, sieht echt ein wenig kürzer aus ;o)
    und sollte so gar noch ein wenig schneller sein ^^

    bb


Anmelden zum Antworten