Hallo, ich habe mich hier gerade neu angemeldet. Hoffe, dass ich hier richtig mit meinem Thema bin :) habe schon alle möglichen Seiten im Internet durchsucht, bin aber leider nicht fündig geworden. Habe vor kurzem angefangen mich mit der Programmiersprache C zu befassen. Ich habe folgendes vor. Ich habe einen UDP Server gebastelt und möchte den ankommenden String String = "aaabbbcccdddeeefff" in Einzelteile zerlegen. Es sollen... String1 = "aaa" String2 = "bbb" String3 = "ccc" usw. zugeordnet werden. Ich kriege das einfach nicht gebacken. Hoffe mir kann hier jemand helfen.
In C gibt es keine Strings, nur char arrays. Auf die kannst du zugreifen, wie auf alle Arrays. https://stackoverflow.com/questions/6679204/how-to-get-substring-in-c/6679254
jemand schrieb: > Auf die kannst du zugreifen, wie auf alle Arrays. Oder die entsprechenden Hilfsfunktionen für Strings verwenden. Diese gehen aber davon aus, dass ein String mit \0 terminiert ist. https://en.cppreference.com/w/c/string/byte
Danke für die Antworten! habe das jetzt folgendermaßen gelöst. char String[100]="abc:def:ghi:jkl"; char delm[5]=":"; char *s1; char *s2; char *s3; char *s4; s1 = strtok(String, delm); s2 = strtok(NULL, delm); s3 = strtok(NULL, delm); s4 = strtok(NULL, delm); printf("%s\n", s1); printf("%s\n", s2); printf("%s\n", s3); printf("%s\n", s4); ist vielleicht nicht die eleganteste Lösung, aber funktioniert.
Ich weiß nicht wie genau du die Doku gelesen hast, aber folgende Dinge sollten dir bewusst sein. strtok ändert String und fügt \0 Zeichen ein. Wenn du am Ende ein printf von String machst könnte das Ergebnis überraschend sein. Gibt es weniger als 3 Trennzeichen, dann sind die sX Pointer zum Teil Null. Für printf ist das Verhalten dann undefiniert, es darf also jeder Compiler machen was er will.
Folgeadermassen funktioniert es auch... char stt[100]="abcdefghijkl"; char st1[5]=""; char st2[5]=""; char st3[5]=""; char st4[5]=""; strncpy(st1, stt, 3); strncpy(st2, stt+3, 3); strncpy(st3, stt+6, 3); strncpy(st4, stt+9, 3); printf("%s\n", st1); printf("%s\n", st2); printf("%s\n", st3); printf("%s\n", st4); Ich sehe mich eher als Programmieranfänger, deswegen habe ich mich auch hier angemeldet ;) Wenn jemand eine bessere Idee hat, dann möge er sie bitte mitteilen.
Wilhelm V. schrieb: > strncpy(st1, stt, 3); Die "Strings" st[1..4] sind dann aber nicht null-terminated. leo
ist das so richtig? char stt[100]="abcdefghijkl"; char st1[5]=""; char st2[5]=""; char st3[5]=""; char st4[5]=""; strncpy(st1, stt, 3); strncpy(st2, stt+3, 3); strncpy(st3, stt+6, 3); strncpy(st4, stt+9, 3); st1[3] = '\0'; st2[3] = '\0'; st3[3] = '\0'; st4[3] = '\0'; printf("%s\n", st1); printf("%s\n", st2); printf("%s\n", st3); printf("%s\n", st4);
leo schrieb: > Wilhelm V. schrieb: >> st1[3] = '\0'; > BTW: bessere Varianten:
1 | n = strlcpy(dst, src, len); |
2 | n = snprintf(dst, len, "%s", src); |
leo
1 | char str[]="aaabbbcccddd"; |
2 | |
3 | |
4 | char substr[3][4]; |
5 | |
6 | for(size_t i=0; i<3; i++) |
7 | snprintf(substr[i], 4, "%.3s", str+i*3); |
8 | |
9 | for(size_t i=0; i<3; i++) |
10 | printf("%s\n", substr[i]); |
Cool, danke für die Antworten! Bis jetzt habe ich mit Pascal und python programmiert, aber C ist echt eine andere Hausnummer muss ich sagen XD Werde weiter mit C rumexperimentieren. LG
Wilhelm V. schrieb: > Bis jetzt habe ich mit Pascal und python programmiert, aber C ist echt > eine andere Hausnummer muss ich sagen Warum tust Du Dir denn das an? Mit C kannst Du nicht mehr, nur komplizierter! Ist es beruflich und hast keine andere Wahl? C wurde damals erfunden um: - wenig Speicher zu benötigen - absichtlich kompliziert zu sein Und es gibt heute keinen Grund mehr, sich damit zu quälen. Hier im Forum ist es sogar sehr gefährlich eine Frage bezüglich C zu stellen, oder die Programmiersprache auch nur in Frage zu stellen! Glaubst Du mir nicht? Schau Dir die Bewertungen zu diesem Beitrag in einer Stunde an! Hier wollen sich ein paar Leute nur profilieren, wie gut sie denn C können! Gruss Chregu
Nimm doch C++. Dort gibt es std::string mit nützlichen Funktionen. Auch die Allozierung ist einfacher, weil sich der String dynamisch anpasst. Statt gcc einfach g++ nehmen, und gut ist es.
Christian M. schrieb: > Und es gibt heute keinen Grund mehr, sich damit zu quälen. Da möchte ich doch darauf hinweisen das dieser Kommentar sowohl off topic als auch redundant ist da dieses Thema in vielen Diskussionen im Forum erschöpfend behandelt wurde.
PittyJ schrieb: > Nimm doch irgendwas anderes was null mit der Frage zu tun hat. Z.B. verschieden lange Mikadostäbchen. Die sortieren in Echtzeit ohne Strom Tastatur, Bildschirm oder Prozessor.
Wilhelm V. schrieb: > strncpy(st1, stt, 3); Die Variante mit Delimiter und strtok() ist eindeutig vorzuziehen. Damit ist die Länge der Teilstrings variabel. Natürlich muß man den Rückgabewert von strtok() testen, ob es Erfolg hatte.
HyperMario schrieb: > PittyJ schrieb: >> Nimm doch > > irgendwas anderes was null mit der Frage zu tun hat. Z.B. verschieden > lange Mikadostäbchen. Die sortieren in Echtzeit ohne Strom Tastatur, > Bildschirm oder Prozessor. Wer C hat der hat auch C++. Warum also nicht die verbesserten C++ Bibliotheken benutzen. Das erspart Zeit und Ärger.
M.K. B. schrieb: > strtok ändert String und fügt \0 Zeichen ein. Ja, das ist sehr elegant und Speicher sparend. In der Regel braucht man den Empfangsstring nach dem Parsen ja nicht mehr. Vorteilhaft ist auch, daß weitere Parserschritte ohne Pointerübergabe erfolgen können. strtok() merkt sich intern den letzen Pointer.
Christian M. schrieb: > Warum tust Du Dir denn das an? Mit C kannst Du nicht mehr, nur > komplizierter! Ist es beruflich und hast keine andere Wahl? C wurde > damals erfunden um: > > - wenig Speicher zu benötigen > - absichtlich kompliziert zu sein Ich mache das Hobbymäßig und ich liebe Herausforderungen ;) Mein Projekt zur Zeit ist ein Raspberry Pi Roboter, den ich per UDP Client (Handy App), den ich mit Android Studio gebastelt habe steuere. Warum habe ich mich für C entschieden? Nun ja, ich habe mir mit C einen UDP Server gebastelt und im Vergleich zu dem Server gestellt, den ich mit Python programmiert habe. Beim testen habe ich festgestellt, dass der Server den ich mit C programmiert habe deutlich schneller läuft als der mit Python programmierte. Seltsamerweise ist es so, dass je mehr Nachrichten an den UDP Server (Python) ankommen, desto langsamer wir er. Kann auch sein, dass ich vielleicht auch was nicht 100%ig beim Python Server optimiert habe, obwohl ich es eigentlich in allen möglichen Variationen getestet habe.
Peter D. schrieb: > Vorteilhaft ist auch, daß weitere Parserschritte ohne Pointerübergabe > erfolgen können. strtok() merkt sich intern den letzen Pointer. In anderen Kreisen wird das als grottiges Softwaredesign bezeichnet.
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.