[C++] Zeilenumbruch in String entfernen

soox

New member
irgendwie hab ich das problem ja sicherlich nicht so schwehr. stehe aber seit >1h auf dem schlauch und google will mir bei meinen fragen auch nicht helfen (muss wohl die falschen zauberwörter verwenden)

folgendes triviales problem habe ich:
ich hab zahlen und buchstaben (also keine lehrzeichen, sonderzeichen,...) in einem std::string welcher zeilenumbrüche beinhaltet. für eine einfachere bearbeitung dieser daten will ich diese zeilenumbrueche entfernen
hat das wer ne einfache loesung?



hier ein beispiel
ich hab folgendes in einem string:
Code:
348a348f971d230cea93
23089709ab973c409d9
32e0987f4098a7384e09
324d87309c4908320408
und will folgendes (als string):
Code:
348a348f971d230cea9323089709ab973c409d932e0987f4098a7384e09324d87309c4908320408
 

phx1024

New member
ich hab bisher nit soviel mit stringobjekten gearbeitet, aber aufs erste würde mir einfallen einfach ne schleife von 0 bis charanzahl im string zu machen, und alle elemente darauf ab zu prüfen ob sie deinen "erlaubten" chars entsprechen (also wies aussieht von 0-9 und a-f) und dann entweder zeihenweise in einen neuen string einzuseten, oder halt erst über nen chararray gehen oder so.

Ich selbst arbeite bisher nur mit char[]'s aber die string-klasse sollte wohl sicher auch was in der art von
char string.char(stelle)
oder gar
string[stelle]
überladen haben.

Sorry wenn ich da jetzt keien 100% richtige antwort gebe, aber ich denke als tip oder denkanstoss vieleicht brauchbar ;)

grüße phx1024
 

soox

New member
tja....so schnell kann man sich auf nur einen ansatz versteifen. danke fuer deinen tip

Code:
charposition = 0;
while ( string::npos != (charposition = entry_value.find_first_not_of("ABCDEF0123456789", charposition) ) ) {
    entry_value.erase(charposition, (size_t)1);
}
 

phx1024

New member
sieht doch verständlich asu was du da als code hast *G* einfach das wegnehmen was nit reinpasst ;-) auch ne idee :-D

Freut mich wenn mein Tip dir da irgendwie hin helfen konnte ;-)

Grüße phx1024
 

Oi!Alex

Member
wie wäre es mit zeile für zeile einlesen und dann den zeilen-string einen "temp string" anhängen und fertig...
 
C

cr

Guest
Die einfachste Lösung wäre es imho gewesen mit find() nach '\n" zu suchen und das dann zu löschen, das hängt aber von der genauen Formatierung der Datei ab meist ist da auch noch ein "\r" drinne.
 

soox

New member
Original von cr
Die einfachste Lösung wäre es imho gewesen mit find() nach '\n" zu suchen und das dann zu löschen, das hängt aber von der genauen Formatierung der Datei ab meist ist da auch noch ein "\r" drinne.
genau, darum habe ich eigentlich ja auch eine funktion gseucht, welche diesen zuerst analysiert und danach entsprechend den ganzen zeilenumbruch entfernt.



Original von Oi!Alex
wie wäre es mit zeile für zeile einlesen und dann den zeilen-string einen "temp string" anhängen und fertig...
ich lese leider nichts ein, sondern bekomme von einer library funktion diesen string. wenn ich zeile fuer zeile einlesen will, muesste ich irgendwie ueber io-streams gehen, was auch wieder umstaendlich ist.
 

ERit

New member
Code:
char terminate_n(char *string)
{
int i=0;
char buffer[sizeof(string)];

for(;;)
{
if(string[i] != '\n'){
buffer[i] = string[i];
}
if(string[i] == '\0')
{
break;
}
i++;
}
return *buffer;
}

edit2: ich denke dass ich die frage immer noch nicht verstanden habe :p
 

soox

New member
edit2: ich denke dass ich die frage immer noch nicht verstanden habe :p
meine frage war primaer, ob es einen "<5 Zeiler" gibt, welcher eine bereits vorhandene funktion benutzt (ich will ja bereits vorhandenes nicht neu programieren). ich bin ja sicherlich nicht der einzige welcher sowas will und somit sollte es ja sicherlich eine einfache loesung mit der string-klasse geben.
 

smiley1337

New member
das ist einfach:

Code:
void delChar( std::string& text, char key )
{
    int ipos = -1;
    while( (ipos = text.find(key)) != -1 ){
        text = text.erase(ipos,1);
    }
}
ungetestet müsste aber so am Einfachsten sein 8)

// Edit:

Aufruf:

Code:
delChar( STRING, '\n' );
bzw unter Windoof noch

Code:
delChar( STRING, '\r' );
 

Der Meister

New member
Bezweifle ich. soox hat bereits einige Posts vorher eine elegantere, flexiblere Version gezeigt.

Und einen "Fehler" hast du auch noch drin: std::string::find gibt nicht -1 zurück sondern std::string::npos, falls die Suche nicht erfolgreich war. Das *kann* bei einer gegeben Implementation -1 sein - muss es aber nicht.
 
Oben