String Delete Function in C
-
Hallo
in Pascal haben wir sowasprocedure Delete(var S: <string or dynamic array>; Index: Integer; Count: Integer);
gibt es dafür ein Äquivalent in C.
Ich habe da was gebastelt ist das OK so, oder geht das besser
void DeleteStr(char *str, char from, char to) { char i = 0; char *src, *dst; for (src = dst = str; *src != '\0'; src++) { *dst = *src; if ((from <= i) & (to >=i )) dst++; i++; } *dst = '\0'; }
-
Das soll etwas aus der Mitte eines Strings löschen und dann den Rest nach vorne rücken?
An alle anderen Leser: strcpy ist keine Lösung, da strcpy annimmt, dass kein Aliasing vorliegt. Und memmove (das speziell für solche Fälle da ist), hat den Nachteil, dass es nicht speziell auf Nullzeichen reagiert.
Nichtsdestotrotz ist deine Implementierung recht umständlich. Kopier doch einfach den Teil hinter dem Ausschnitt zum Anfang des Ausschnitts. Dieses ganze Verschieben von Daten auf sich selber, das du hier zusätzlich ausführst, ist doch absolut unnötig. Danach kann man dann eventuelle noch über mögliche Effizienzsteigerungen mittels toller Tricks nachdenken, aber erst einmal sollte das Ziel sein, nur das zu Verschieben, was wirklich nötig ist.
-
nimm statt char als Laufindex-Datentyp lieber unsigned int oder besser size_t.
char bietet sich nur für kurze Strings (2^8=256) an.
-
Für so etwas gibt es
memmove
:#include <stdio.h> #include <stddef.h> #include <string.h> void DeleteStr(char *str, size_t from, size_t to) { char *overwriteBegin = str + from; char const *tail = str + to; size_t const tailLength = strlen(str) - to; size_t const tailLengthTerminated = tailLength + 1; memmove(overwriteBegin, tail, tailLengthTerminated); } int main(void) { char test[] = "Hallo Test"; DeleteStr(test, 2, 8); puts(test); return 0; }
-
TyRoXx schrieb:
Für so etwas gibt es
memmove
:Mit dem schon erwähnten Nachteil, dass der String unnötigerweise zweimal abgelaufen wird. Einmal für strlen, einmal für memmove. Das könnte man auch alles in einem Durchgang machen.
besser int schrieb:
nimm statt char als Laufindex-Datentyp lieber unsigned int oder besser size_t.
char bietet sich nur für kurze Strings (2^8=256) an.In Pascal haben Zeichenketten maximal 255 Zeichen :p
-
Danke für die Antworten
Leider mag mein Microchip PIC memmove nicht
kann man memmove rudimentär diskret ausdrücken, als
eigenständige Funktion.
-
ats3788 schrieb:
Leider mag mein Microchip PIC memmove nicht
Das ist kein Problem des Controllers sondern des Compilers.
Möglicherweise bedienst du den auch nur falsch.ats3788 schrieb:
kann man memmove rudimentär diskret ausdrücken, als
eigenständige Funktion.Klar kann man das.
Aber dann kannst du auch gleich DeleteStr ohnememmove
schreiben.