String zerlegen (bla=bla)
-
Hi,
es gibt hier schon viele Posts wie man Strings zerlegt aber so richtig bin ich nie dahinter gestiegen ;-((ich habe einen
char bla[255] = "bla1=bla2";
char end[255];
char start[255];so jetzt möchte ich das
start = bla1
end = bla2
ist.wie kann man das machen das ich das auch kapiere ??
mfg
wdsl
-
bei char* Arrays, benutzt man std::strtok
dafür
-
Jo aber ich habe da noch ein Problem
hier meine Function
bool MyINI::Read(char* File){ ifstream inFile; //File =File; inFile.open(File); char buf[1024] = ""; char start[1024] = ""; char end[1024] = ""; while(inFile.eof()){ //Split nach dem ersten = inFile.getline(buf , 1024); start = strtok(buf, "="); end = strtok(NULL, "="); } read = 1; }
Ich bekomme in folgenden Zeilen den Fehler L-Wert erwarted
start = strtok(buf, "="); end = strtok(NULL, "=");
und ich habe kein Ahnung warum
das gleiche Passiert auch wenn ich einer Globalen Variable von der Klasse einen Wert zu weisen will ;-((
-
was bedeutet es, NULL zu tokenizen?
-
strtok verwendet soweit ich gelesen habe einen static buf oder so ähnlich so dass man es nur einmal übergeben muss
-
strtok verwendet soweit ich gelesen habe einen static buf oder so ähnlich so dass man es nur einmal übergeben muss
Nicht muss sondern darf
Beim ersten Aufruf übergibt man den zu zerhackenden String und erhält das erste Token, falls vorhanden. Jedes weitere Token erhält man durch den Aufruf von strtok(NULL) (oder strtok(0) für Leute mit C++ Geschmak). Die Übergabe eines Strings würde strtok von vorne beginnen lassen.
Das wäre z.B. eine hübsche Form einer Endlosschleife:char str[] = "Hallo Welt"; while (char* token = strtok(str, "\n")) { cout << token; }
-
igitt.
-
Mit getline kannst du, wenn du dein char Array über einen Filestream füllst, bis zu einem bestimmten Trennzeichen einlesen.
Ansonsten benutzt du einfach stringstreams.int main() { ifstream inFile("text.txt"); char buff[1024]; while(inFile.getline(buff,1024,'=')) cout << buff <<endl; inFile.close(); return 0; }
für strings habe ich folgende Funktion:
string Separator(string &sSourceText,const char cSeparator,int iPos) { int x; while(iPos--) x=1+sSourceText.find(cSeparator,x); return sSourceText.substr(x,sSourceText.find(cSeparator,x)-x); }
-
Mit stringstreams kann man es so machen.
Brauchst aber die <sstream.h>string separator(istringstream &stext,const char &sep,int pos) { string ret;while(pos--&&getline(stext,ret,sep));return ret; }
-
immer dieses .h. zum verzweifeln.
-
Das mit dem .h ist gewöhnungssache.
Ist aber meiner Meinung nach auch nicht schlimm, außer das man ANSI Standart etwas mit Füßen tritt.
-
Ist aber meiner Meinung nach auch nicht schlimm
// a.cpp #include <sstream.h>
Antwort einiger gängiger C++ Compiler:
a) VC 6: fatal error C1083: Include-Datei kann nicht geoeffnet werden: 'sstream.h': No such file or directory
b) g++-3.2.2: sstream.h: No such file or directory
c) g++-2.95: sstream.h: No such file or directory
d) Comeau C++: catastrophic error: could not open source file "sstream.h"
So, 0 von 4 Compiler sind deiner Meinung.
Mal ehrlich, was bitte bringt es einem für einen Vorteil einen scheinbar nicht sehr verbreiteten Header zu verwenden, wenn es im Standard einen entsprechenden gibt, der nahezu überall funktioniert?Oder ist "ANSI Standard mit Füßen treten" schon Vorteil genug?
-
Oder ist "ANSI Standard mit Füßen treten" schon Vorteil genug?
Vllt. ist das wie mit den Angestellten in einer Firma. Wenn man die ein wenig tritt kommt manchmal auch mehr leistung raus was ja durchaus ein vorteil für die Firma ist ;o)
-
Tja, ein Compiler der sstream.h nicht kennt gehört halt in die Tonne.
Gute Beispiele sind halt VC 6 und g++ ...
-
ein aktueller compiler mss es nicht kennen
-
_Stefan schrieb:
Tja, ein Compiler der sstream.h nicht kennt gehört halt in die Tonne.
Gute Beispiele sind halt VC 6 und g++ ...Hm... Man könnte aber auch sagen:
Programmierer die seltene / veraltete tachnicken verwenden gehören in die Tonne ;o) FreeStyle C kommt nicht so gut an wenn es darum geht etwas portabel zu erstellen ;o)
-
Don't feed the Trolls
-
Don't feed the Troll kingruedi.