Löschen eines Char-Arrays c

Lesezeit: 6 Minuten

Benutzeravatar von ant2009
Ameise2009

Ich dachte, durch das Setzen des ersten Elements auf Null würde der gesamte Inhalt eines char-Arrays gelöscht.

char my_custom_data[40] = "Hello!";
my_custom_data[0] = '\0';

Dadurch wird jedoch nur das erste Element auf null gesetzt.

oder

my_custom_data[0] = 0; 

anstatt zu verwenden memsetich dachte, die 2 obigen Beispiele sollten alle Daten löschen.

  • Jared, warum hast du das c++-Tag gesetzt? Er sprach über “C” und fügte keine C++-bezogenen Tags hinzu.

    – Johannes Schaub – litb

    11. März 2009 um 1:08 Uhr

  • Dies gilt gleichermaßen für Zeichenarrays in C++, auch wenn er dies nicht spezifiziert hat.

    – Adam Hawes

    11. März 2009 um 5:37 Uhr

  • Ich habe das C++-Tag entfernt, um zu vermeiden, was wir bereits bei Leuten gesehen haben, die C++-spezifische Lösungen anbieten

    – Alnitak

    11. März 2009 um 16:34 Uhr

Benutzeravatar von JaredPar
JaredPar

Es hängt davon ab, wie Sie das Array anzeigen möchten. Wenn Sie das Array als eine Reihe von Zeichen betrachten, können Sie die Daten nur löschen, indem Sie jeden Eintrag berühren. memset ist wahrscheinlich der effektivste Weg, dies zu erreichen.

Wenn Sie sich dagegen dafür entscheiden, dies als C/C++-Zeichenfolge mit Nullterminierung anzuzeigen, wird die Zeichenfolge durch Setzen des ersten Bytes auf 0 effektiv gelöscht.

  • Das Schlüsselwort in der Antwort ist „effektiv“. Nur das erste Element wird auf 0 gesetzt und der Rest hat noch undefinierte Werte, aber wenn Sie das Array als nullterminierten String behandeln und das erste Element null ist, dann wird der String als leer betrachtet.

    – Arnold Spence

    11. März 2009 um 1:46 Uhr

  • in der Tat, das ist die Antwort, Leute.

    – Johannes Schaub – litb

    11. März 2009 um 1:49 Uhr

  • @caparcode, genau. Aus diesem Grund ist es sehr wichtig zu verstehen, wie das Array verwendet wird.

    – JaredPar

    11. März 2009 um 1:49 Uhr

  • Ja, das hätte ich in meinem ersten Post sagen sollen. Das Zeichen ist eine abgeschlossene Zeichenfolge. entweder diese werden diesen Trick tun. verkohlen[0] = ‘\0’; oder char[0] = 0. Ich bin mir nicht sicher, aber ich habe gehört, dass die Verwendung von ‘\0’ besser für die Verwendung von nullterminierten Zeichenfolgen ist.

    – Ameise2009

    11. März 2009 um 2:06 Uhr

  • @robUK, ja, du hast Recht. Technisch gesehen ist ‘\0’ gleich 0 (in ASCII), aber Sie sollten ‘\0’ verwenden, weil es Ihre Absicht klar macht

    – Markus Testa

    11. März 2009 um 2:23 Uhr

Benutzeravatar von John Feminella
Johannes Feminella

Ein Array in C ist nur ein Speicherplatz, also tatsächlich Ihr my_custom_data[0] = '\0'; Zuweisung setzt einfach das erste Element auf Null und lässt die anderen Elemente intakt.

Wenn Sie alle Elemente des Arrays löschen möchten, müssen Sie jedes Element besuchen. Das ist was memset ist für:

memset(&arr[0], 0, sizeof(arr));

Dies ist im Allgemeinen der schnellste Weg, sich darum zu kümmern. Wenn Sie C++ verwenden können, ziehen Sie stattdessen std::fill in Betracht:

char *begin = &arr;
char *end = begin + sizeof(arr);
std::fill(begin, end, 0);

  • Ich glaube, die zweite Version sollte sein: std::fill( arr, arr+ sizeof(arr)/sizeof(arr[0]), 0 );

    – David Rodríguez – Dribeas

    11. März 2009 um 0:40 Uhr

  • Klarstellung: Verwenden Sie sizeof nicht mit fill, da Sie später Probleme mit Arrays von int, long, double oder was auch immer bekommen.

    – Zan Luchs

    11. März 2009 um 1:08 Uhr

  • Ich bevorzuge: std::fill(&arr[0]&arr[arr_len]0);

    – Zan Luchs

    11. März 2009 um 1:10 Uhr

  • Zan Lynx, das ist undefiniertes Verhalten. du kannst &arr nicht machen[arr_len]. aber Sie müssen std::fill(arr, arr + sizeof arr, 0); oder wenn du irgendwo die Länge hast std::fill(arr, arr + arr_len, 0); unter der Annahme eines Arrays von char

    – Johannes Schaub – litb

    11. März 2009 um 1:11 Uhr

  • Es ist nur in C gültig. Obwohl die Frage eindeutig auf C abzielte (ein anderer Typ hat ein C++-Tag hinzugefügt, ich habe keine Ahnung warum), zeigt std::fill C++-Affinität 🙂

    – Johannes Schaub – litb

    11. März 2009 um 1:12 Uhr

Warum denken Sie, dass das Setzen eines einzelnen Elements das gesamte Array löschen würde? Besonders in C passiert wenig, ohne dass der Programmierer es explizit programmiert. Wenn Sie das erste Element auf Null (oder einen beliebigen Wert) setzen, haben Sie genau das getan, und nicht mehr.

Beim Initialisieren können Sie ein Array auf Null setzen:

char mcd[40] = {0}; /* sets the whole array */

Ansonsten kenne ich keine andere Technik als Memset oder ähnliches.

  • Ich denke, das hängt von dem Compiler ab, den Sie verwenden

    – Kakaofan

    11. März 2011 um 7:38 Uhr

  • @cocoafan: Nein, es ist nicht Compiler-abhängig. Es ist Teil der Sprachspezifikation. Jeder Compiler, der sich anders verhält, folgt nicht der C-Sprache.

    – abelenky

    12. März 2011 um 4:26 Uhr

  • Das wusste ich nicht, danke. Ich konnte keine Ressource finden, wo ich diesen Sonderfall lesen kann. Wäre schön, es als Lesezeichen zu haben.

    – Kakaofan

    13. März 2011 um 7:58 Uhr

  • Dies wird Teilinitialisierung genannt. Ich habe die C99-Spezifikation nicht, aber hier sind zwei Quellen: bit.ly/enBC2m “Sie müssen nicht alle Elemente in einem Array initialisieren. Wenn ein Array teilweise initialisiert ist, erhalten nicht initialisierte Elemente den Wert 0 des entsprechenden Typs.” bit.ly/f9asHH “Wenn das Array weniger Initialisierer als Elemente enthält, werden die verbleibenden Elemente automatisch auf 0 initialisiert.”

    – abelenky

    13. März 2011 um 15:14 Uhr


  • Dies gilt nicht für ein Array, das bereits deklariert und mit Werten belegt wurde, oder?

    – enthäutete Knuckles

    26. Oktober 2018 um 18:12 Uhr

Verwenden:

memset(my_custom_data, 0, sizeof(my_custom_data));

Oder:

memset(my_custom_data, 0, strlen(my_custom_data));

Benutzeravatar von Cristian Altamirano
Cristian Altamirano

Versuchen Sie den folgenden Code:

void clean(char *var) {
    int i = 0;
    while(var[i] != '\0') {
        var[i] = '\0';
        i++;
    }
}

  • FYI – Code um 4 Leerzeichen einrücken oder auswählen und auf die Schaltfläche “Code” klicken, die wie zwei Binärzeilen aussieht.

    – Benutzer229044

    10. Dezember 2010 um 20:46 Uhr

  • Hervorragende Lösung, wenn Sie string.h nicht für memset() einschließen möchten.

    – Akash Agarwal

    9. August 2018 um 2:54 Uhr


Benutzeravatar von Nakilon
Nakilon

Warum nicht verwenden memset()? So geht’s.

Das Setzen des ersten Elements lässt den Rest des Speichers unberührt, aber str-Funktionen behandeln die Daten als leer.

  • FYI – Code um 4 Leerzeichen einrücken oder auswählen und auf die Schaltfläche “Code” klicken, die wie zwei Binärzeilen aussieht.

    – Benutzer229044

    10. Dezember 2010 um 20:46 Uhr

  • Hervorragende Lösung, wenn Sie string.h nicht für memset() einschließen möchten.

    – Akash Agarwal

    9. August 2018 um 2:54 Uhr


Benutzeravatar von Jake1164
Jake1164

Bitte finden Sie unten, wo ich mit Daten im Array nach Fall 1 und Fall 2 erklärt habe.

char sc_ArrData[ 100 ];
strcpy(sc_ArrData,"Hai" );

Fall 1:

sc_ArrData[0] = '\0';

Ergebnis:

-   "sc_ArrData"
[0] 0 ''
[1] 97 'a'
[2] 105 'i'
[3] 0 ''

Fall 2:

memset(&sc_ArrData[0], 0, sizeof(sc_ArrData));

Ergebnis:

-   "sc_ArrData"
[0] 0 ''
[1] 0 ''
[2] 0 ''
[3] 0 ''

Obwohl es ausreicht, das erste Argument auf NULL zu setzen, ist die Verwendung von memset ratsam

1422180cookie-checkLöschen eines Char-Arrays c

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

Privacy policy