Hallo Ich sitze hier und fudele an ein paar Funktionen und da meine Hirnbüchse qualmt möchte ich euch fragen, in C gibt es so viele SSting Funktionen, die meiner Meinung, nicht wirklich nützlich sind ich komme aus der Pascal Welt und habe deswegen einen anderen Ansatz bei "C". Ich suche eine Funktion wie StringDelete(char * dst, int von,int Bis) die mir aus einem Text Array von, bis herausschneidet und ein StringInsert wäre auch toll StringInsert(char * dst,char * src,int pos) und ein stringCopy(char * dst,int von, int bis); die habe ich mir geschrieben aber die ist so scheiße das ich mich nicht traue sie zu posten. Finde es schade das dies im Standard Repertoir nicht bei "C" vorkommt. Danke Leute, Liebe Grüße aus dem sonnigen Font de Sa Cala
Gast
#6175138
Martin M. schrieb: > Ich suche eine Funktion wie StringDelete(char * dst, int von,int Bis) $ man memmove und genau zaehlen ;-) leo
Gast
#6175154
Martin M. schrieb: > eine Funktion wie StringDelete(char * dst, int von,int Bis) > die mir aus einem Text Array von, bis herausschneidet z.B. so
1 | |
2 | |
3 | |
4 | |
5 | |
6 | |
7 | |
Gast
#6175164
zitter_ned_aso schrieb: > memmove(dst+von, dst+Bis, strlen(dst+Bis)); > dst[strlen(dst)-(Bis-von)]='\0'; Man kann natuerlich die '\0' mitmoven und erspart sich damit die 2. Zeile. leo
Gast
#6175190
leo schrieb: > Man kann natuerlich die '\0' mitmoven und erspart sich damit die 2. > Zeile. Ja, Danke für diesen Hinweis:
1 | |
2 | |
3 | |
4 | |
5 | |
6 | |
7 | |
8 | |
1 | |
2 | |
3 | |
4 | |
5 | |
6 | |
7 | |
8 | |
9 | |
Gast
#6175200
StirngInsert(...) ist natürlich sehr gefährlich weil "source" groß genug für einen neuen String sein muss. Keine Ahnung wie man hier die Gefahr einschränkt ;-)
Martin M. schrieb: > in C gibt es so viele SSting Funktionen, > die meiner Meinung, nicht wirklich nützlich sind ich komme aus der > Pascal Welt Da kann ich Dir C# mit .NET empfehlen, da kannst Du mit Strings ebenso elegant oder sogar noch eleganter hantieren wie früher mit Delphi.
Gast
#6175209
zitter_ned_aso schrieb: > StirngInsert(...) ist natürlich sehr gefährlich weil "source" groß > genug > für einen neuen String sein muss. > > Keine Ahnung wie man hier die Gefahr einschränkt ;-) Indem man die moegliche Gesamtlaenge als Param mitgibt, prueft und sich darauf verlaesst, dass diese auch korrekt ist. leo
Gast
#6175215
ja, hört sich vernünftig an.
Wow Danke,war nur Einkaufen und so viele antworten, Danke Danke, werde das nach dem essen mal ausprobieren
leo schrieb: > zitter_ned_aso schrieb: >> memmove(dst+von, dst+Bis, strlen(dst+Bis)); >> dst[strlen(dst)-(Bis-von)]='\0'; > > Man kann natuerlich die '\0' mitmoven und erspart sich damit die 2. > Zeile. > > leo Und wenn Bis nicht am Ende vom String liegt?
Martin M. schrieb: > Finde es schade das dies im Standard Repertoir > nicht bei "C" vorkommt. Du kannst dir die Funktionen selber schreiben, ist eine prima Übung. Viele Stringfunktionen der Standardlibrary haben sowieso den Nachteil, dass sie nicht wissen, wie groß der Zielbereich ist.
Dirk B. schrieb: > Und wenn Bis nicht am Ende vom String liegt? Dann liegt das \0 immer noch am Ende.
@Johnny B. Das ist nett aber ich programmiere damit µC also so Dinger wie ESP32 und mit den Funktionen Die ihr mir gegeben habt geht das ganz gut. Windows Sachen programmiere ich in Delphi. Danke char* StringDelete(char * dst, int von,int Bis) { // Hier die + 1 eingefügt sonst siehe unten memmove(dst+von, dst+Bis+1, strlen(dst+Bis+1)); dst[strlen(dst)-(Bis-von)]='\0'; return dst; } sonst wird ein Char zuviel kopiert Herzlichen Dank an Zitter_ned und Leo für ihre besondere Hilfe Schade das das Forum keine Emotes hat. Jetzt guck ich mal ob ich das StringCopy hinbekomme.
Martin M. schrieb: > @Johnny B. Das ist nett aber ich programmiere damit µC also so Dinger > wie ESP32 und mit den Funktionen Die ihr mir gegeben habt geht das ganz gut. Warum hast du die Frage dann im Forum "PC-Programmierung" gepostet? > char* StringDelete(char * dst, int von,int Bis) > { // Hier die + 1 eingefügt sonst siehe unten > memmove(dst+von, dst+Bis+1, strlen(dst+Bis+1)); > dst[strlen(dst)-(Bis-von)]='\0'; > > return dst; > } Es wurde ja schon geschrieben, dass man auch einfach ein Zeichen mehr kopieren und sich dann die zweite Zeile sparen kann, vor allem auch das strlen, das dann nochmal den kompletten String durchiterieren muss.
Rolf M. schrieb: > Dirk B. schrieb: >> Und wenn Bis nicht am Ende vom String liegt? > > Dann liegt das \0 immer noch am Ende. Oh Mann, ich war irgendwie bei dem StringCopy.
Gast
#6176121
zitter_ned_aso schrieb: >
1 | |
2 | |
3 | |
4 | |
Ich würde schon ein bisschen mehr testen, nämlich das "bis" nicht die String-Länge überschreitet. Aber fangen wir mal von vorne an: Martin M. schrieb: > ich komme aus der > Pascal Welt und habe deswegen einen anderen Ansatz bei "C". > Ich suche eine Funktion wie StringDelete(char * dst, int von,int Bis) > die mir aus einem Text Array von, bis herausschneidet Pascal zählt String-Positionen ab 1, C ab 0. Der OP sollte sich zuerst mal überlegen ob er Pascal-Zählung in C haben möchte. Umgekehrt ist es auch keine besonders gute Idee eine Funktion aus Pascal nachzubasteln, die so heißt wie in Pascal, aber um eine Position verschoben arbeitet. Damit verwirrt man sich nur selbst. Pascals normales Delete() verwendet nicht wie behauptet "von" und "bis" Positionen, sondern Startposition und Länge des zu löschenden Bereiches. Damit wären wir bei [c] /*! \param s string to delete a part from \param off index (counting from 0) of first characer to delete from s If off exceeds strlen(s), then off is assumed to be strlen(s) \param n maximum number of characters to be deleted. If off+n exceeds string length strlen(s), then only the remaining chars in s deleted. \return s */ char *strdel(char *s, size_t off, size_t n) { assert(s != NULL); size_t l = strlen(s); off = (off > l) ? l : off; n = (off + n) > l ? (l - off) : n; memmove(s + off, s + off + n, l - off - n + 1); return s; } [c] Die Funktion korrigiert ein paar mögliche Fehler in den übergebenen Parametern. Eigentlich bin ich kein Fan von solchen heimlich vorgenommenen Reparaturen. Hier würde ich es machen um eine bequeme Funktion zu bekommen. Ansonsten assert(). off wird bei Überlauf bewusst auf strlen(s) und nicht strlen(s) -1 gesetzt. Damit wird das \0-Byte immer kopiert, auch wenn es dann in Grenzfällen auf sich selbst kopiert wird. Der Compiler darf gerne die Berechnungen optimieren. Dazu habe ich keine Lust.
Martin M. schrieb: > Ich suche eine Funktion wie StringDelete > und ein StringInsert wäre auch toll Erfahrene Programmierer manipulieren Strings nicht direkt, sondern legen sich einen separaten Antwortpuffer an. Der eingehende String wird dann mit sscanf oder strtok geparst und abschließend mit strncat oder snprintf die Antwort gebastelt. Damit umgeht man elegant das Problem der Pufferüberläufe. Eingehende Daten werden in der Regel nicht als Kopie, sondern als Pointer auf const übergeben, d.h. die aufgerufene Funktion darf die Daten nicht manipulieren. Daher gibt es die von Dir gewünschten Funktionen unter C nicht und sie werden auch nicht benötigt.
P.S.: strtok ändert den String, geht also formal nicht auf const. Auf µCs gibt es in der Regel aber keinen Schreibschutz auf RAM.
Antwort schreiben
Bitte melde dich an, um einen Beitrag zu schreiben.