String Delete Function in C



  • Hallo
    in Pascal haben wir sowas

    procedure 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';
    }
    

  • Mod

    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;
    }
    

  • Mod

    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 ohne memmove schreiben.


Anmelden zum Antworten