CString parsen
-
Ich möchte gerne einen cstring parsen. Da ich sowas noch nie vorher gemacht habe, habe ich mich einfach mal ans rumprobieren gemacht. Schnell merkte ich, dass mein Programm abstürzte...
Ich habe folgende Funktion, die mein String parsen soll:
void parseCordString(char txt[256]) { int pid; char pname[20]; float px, py, pz, rx, ry, rz; sscanf(txt, "{%i, \"%s\", %f, %f, %f, %f, %f, %f}", pid, pname, px, py, pz, rx, ry, rz); if (pid != PlayerServerID) { if (PlayerS[pid].isActive) { //Setze neue Position } else { //Erstelle neuen Spieler } } }
Könnt ihr mir bei dem Erstellen einer richtigen Funktion helfen?
-
cbacon93 schrieb:
Schnell merkte ich, dass mein Programm abstürzte...
Ich tipp mal drauf, dass
pname
übergelaufen ist. Mit scanf() muss man manchmal vorsichtig sein, vielleicht geht's ja so:sscanf(txt, "{%i, \"%20s\", %f, %f, %f, %f, %f, %f}", pid, pname, px, py, pz, rx, ry, rz); // ^^
Um die Länge zu begrenzen. Vielleicht ist's aber auch was anderes. Schwer zu sagen, solange du uns die Eingabe nicht zeigst.
-
Vielleicht ist's aber auch was anderes.
Könnte schon sein...
Hat dein Compiler nicht gemeckert? Du gibst in der Zeile ja gar keine Adressen an scanf(), sondern (bis auf pname) undefinierte Werte.
-
Das alte buffer[wirdschonreichen]-Problem. Es ist böse und ihr verdient es darunter zu leiden weil ihr es trotzdem benutzt.
Du solltest vielleicht einen Debugger anschmeißen. Der sagt dir dann in welcher Zeile dein Programm abstürzt und du kannst dir die Variablen ausgeben lassen die zum Absturz geführt haben. Dann kommt man eigentlich selbst schnell drauf was man falsch gemacht hat.
-
hmm echt?
Der Text der zu parsen ist sieht so aus:{[playerID], [Playername], [posX], [posY], [posZ], [rotX], [rotY], [rotZ]}
@µngbd: stürzt leider immer noch ab
Vc++ 2008 sagt mir :
Es sind keine Symbole für Aufruflistenrahmen geladen. Der Quellcode kann nicht angezeigt werden.
-
cbacon93 schrieb:
{[playerID], [Playername], [posX], [posY], [posZ], [rotX], [rotY], [rotZ]}
Schrieb doch mal ne Zeichenkette nach diesem Muster, um die Funktion zu testen:
int parse_string_ding ( char* s ) { } int main() { // {[playerID], [Playername], [posX], [posY], [posZ], [rotX], [rotY], [rotZ]} char* txt = "123, Hugo, 1, 2, 3, 4, 5, 6"; return 0; }
Btw. hat die letzte Variable den geilsten Namen :D. Hoffen wir mal, das färbt nicht aufs Programm ab.
-
@µngbd: stürzt leider immer noch ab
Vesuch's mal so:
char *txt = "{1, \"Playername\", 2, 3, 4, 5, 6, 7}"; sscanf(txt, "{%i, \"%20s\", %f, %f, %f, %f, %f, %f}", &pid, pname, &px, &py, &pz, &rx, &ry, &rz);
Stürzt nicht mehr ab (warum wohl nicht?). Es bleibt die Sache mit Playername, und die verbockt mir die floats, die danach kommen. Irgendjemand kennt sich sicher mit den Formatstrings aus: wie kriegt man das in den Griff?
-
Klar aber den muss ich ja auch irgendwie mit schicken...
-
cbacon93 schrieb:
Klar aber den muss ich ja auch irgendwie mit schicken...
scanf() ist halt doch nicht so einfach wie manche gerne behaupten. Du könntest gut darauf verzichten, indem du den String mit man: strtof oder sowas durchgehst und bei dem zweiten Eintrag eine Ausnahme machst und man: memcpy nimmst.
-
µngbd schrieb:
...indem du den String mit man: strtof oder sowas durchgehst und bei dem zweiten Eintrag eine Ausnahme machst und man: memcpy nimmst.
oder er macht sich 'nen kleinen CSV-parser (mit strtok z.b.). die zahlen kann er danach ja dann mit atoi() o.ä. umwandeln.
so etwa:char txt[] = "123, Hugo, 1, 2, 3, 4, 5, 6"; // <-- muss array sein, kein pointer char *p; ... p = strtok (txt, ", "); while (p) { puts (p); p = strtok (0, ", "); }