Der richtige Weg, um einen C-String zu leeren

Lesezeit: 3 Minuten

Ich habe an einem Projekt in C gearbeitet, bei dem ich viel mit Strings herumspielen muss. Normalerweise programmiere ich in C++, also ist das etwas anders, als nur string.empty() zu sagen.

Ich frage mich, was der richtige Weg wäre, um eine Zeichenfolge in C zu leeren. Wäre es das?

buffer[80] = "Hello World!\n";

// ...

strcpy(buffer, "");

  • Dein Beispiel ist verwirrend. Anscheinend wurde der Puffer an anderer Stelle deklariert und Sie versuchen, ihn aus einem Literal zu initialisieren. Hier muss nichts gelöscht werden.

    – pmr

    12. November 2011 um 21:55 Uhr

  • string.empty() verändert den String nicht

    – David Heffernan

    12. November 2011 um 21:57 Uhr

Kommt darauf an, was man unter “leer” versteht. Wenn Sie nur eine Zeichenfolge der Länge Null möchten, funktioniert Ihr Beispiel.

Das wird auch funktionieren:

buffer[0] = '\0';

Wenn Sie den gesamten Inhalt der Zeichenfolge auf Null setzen möchten, können Sie dies folgendermaßen tun:

memset(buffer,0,strlen(buffer));

Dies funktioniert jedoch nur zum Nullstellen bis zum ersten NULL-Zeichen.

Wenn die Zeichenfolge ein statisches Array ist, können Sie Folgendes verwenden:

memset(buffer,0,sizeof(buffer));

  • Zur Verdeutlichung funktioniert die letzte Methode, wenn buffer Es ist ein Array, aber nicht, wenn es ein Zeiger ist. Der Compiler muss die Größe des Arrays sehen können. Wenn buffer ein Zeiger ist, wird er nur die Größe eines Zeigers auf Null setzen, wahrscheinlich 4 oder 8 Bytes.

    – Tor Klingeberg

    14. September 2015 um 15:26 Uhr

  • Diese Antwort – stackoverflow.com/a/56048617/3114742 – spricht dafür, NIEMALS zu verwenden strlen mit memset – benutz nur sizeof

    – Zach Smith

    8. Mai 2019 um 20:40 Uhr

Zwei andere Möglichkeiten sind strcpy(str, ""); und string[0] = 0

Um den Variableninhalt wirklich zu löschen (falls Sie schmutzigen Code haben, der mit den obigen Schnipseln nicht richtig funktioniert 😛 ), verwenden Sie eine Schleife wie im folgenden Beispiel.

#include <string.h>

...

int i=0;
for(i=0;i<strlen(string);i++)
{
    string[i] = 0;
}

Falls Sie ein dynamisch zugewiesenes Array von Zeichen von Anfang an löschen möchten, können Sie entweder eine Kombination aus malloc() und memset() oder – und das ist viel schneller – calloc() verwenden, das dasselbe wie malloc tut, aber initialisiert das ganze Array mit Null.

Endlich möchte ich, dass Sie Ihre Laufzeit im Auge behalten. Wenn Sie große Arrays (6 Ziffern und mehr) handhaben, sollten Sie außerdem versuchen, den ersten Wert auf Null zu setzen, anstatt memset() durch den gesamten String laufen zu lassen.

Es mag zunächst schmutziger aussehen, ist aber viel schneller. Du musst nur mehr auf deinen Code achten 😉

Ich hoffe, das war für irgendjemanden nützlich 😉

Kommt darauf an, was du mit entleeren meinst. Wenn Sie nur eine leere Zeichenfolge möchten, können Sie dies tun

buffer[0] = 0;

Wenn Sie jedes Element auf Null setzen möchten, tun Sie dies

memset(buffer, 0, 80);

Wenn Sie versuchen, einen Empfangspuffer für etwas zu löschen, das Zeichenfolgen empfängt, habe ich herausgefunden, dass der beste Weg darin besteht, memset wie oben beschrieben zu verwenden. Der Grund dafür ist, dass, egal wie groß der nächste empfangene String ist (natürlich durch die Größe des Puffers begrenzt), er automatisch ein Asciiz-String ist, wenn er in einen vorab auf Null gesetzten Puffer geschrieben wird.

Ich bin ein Anfänger, aber … nach meinem Wissen ist der beste Weg

strncpy(dest_string,"",strlen(dest_string));

Benutzeravatar von Steve Lau
Steve Lau

Für diejenigen, die auf diese Frage geklickt haben, um einige Informationen zu sehen bzero und explicit_bzero:

  • bzero: Diese Funktion ist veraltet
  • explizit_bzero: Dies ist keine Standard-C-Funktion und fehlt auf einigen BSDs

Weitere Erklärung:

  • warum-benutze-bzero-über-memset
  • Null(3)

Benutzeravatar von Denes Borsos
Denes Borsos

Benötigt den Namen der Zeichenfolge und seine Länge wird alle Zeichen auf Null setzen. Andere Methoden könnten bei der ersten Null, auf die sie stoßen, anhalten

    void strClear(char p[],u8 len){u8 i=0; 
        if(len){while(i<len){p[i]=0;i++;}}
    }

1411590cookie-checkDer richtige Weg, um einen C-String zu leeren

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy