wake-up-neo.com

löschen eines Zeichen-Arrays c

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

Dies setzt jedoch nur das erste Element auf null.

oder

my_custom_data[0] = 0; 

anstatt memset zu verwenden, dachte ich, dass die beiden obigen Beispiele alle Daten löschen sollen.

96
ant2009

Es hängt davon ab, wie Sie das Array anzeigen möchten. Wenn Sie das Array als eine Reihe von Zeichen anzeigen, besteht die einzige Möglichkeit zum Löschen der Daten darin, jeden Eintrag zu berühren. memset ist wahrscheinlich der effektivste Weg, um dies zu erreichen.

Wenn Sie dies jedoch als C/C++ - nullterminierte Zeichenfolge anzeigen möchten, wird das Setzen des ersten Bytes auf 0 die Zeichenfolge effektiv löschen.

104
JaredPar

Ein Array in C ist nur ein Speicherplatz. In der Tat setzt Ihre my_custom_data[0] = '\0';-Zuordnung einfach das erste Element auf Null und die anderen Elemente bleiben erhalten.

Wenn Sie alle Elemente des Arrays löschen möchten, müssen Sie jedes Element besuchen. Dafür gibt es memset:

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

Dies ist in der Regel der schnellste Weg, dies zu tun. 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);
68
John Feminella

Warum würden Sie glauben, ein einzelnes Element zu setzen, würde das gesamte Array löschen? Vor allem in C passiert kaum etwas, 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 nichts weiter.

Bei der Initialisierung 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.

22
abelenky

Benutzen:

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

Oder:

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

Versuchen Sie den folgenden Code:

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

Warum nicht memset() verwenden? So macht man es.

Wenn Sie das erste Element festlegen, bleibt der Rest des Speichers unangetastet, aber die str-Funktionen behandeln die Daten als leer.

7
John Fricker

Pls finden Sie unten, wo ich mit Daten im Feld 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 ''

Wenn Sie das erste Argument auf NULL setzen, ist dies der Trick, aber es empfiehlt sich, Memset zu verwenden 

6
AKN

Nee. Alles, was Sie tun, ist den ersten Wert auf '\ 0' oder 0 zu setzen.

Wenn Sie mit mit Null versehenen Zeichenfolgen arbeiten, wird im ersten Beispiel ein Verhalten angezeigt, das dem entspricht, was Sie erwarten. Der Speicher ist jedoch noch festgelegt.

Wenn Sie den Speicher ohne Memset löschen möchten, verwenden Sie eine for-Schleife.

4
Alan

Sie sollten Memset verwenden. Das Festlegen nur des ersten Elements funktioniert nicht. Sie müssen alle Elemente festlegen. Wenn nicht, wie könnten Sie nur das erste Element auf 0 setzen?

3
Michael

Das Schreiben eines Nullzeichens in das erste Zeichen bewirkt genau dies. Wenn Sie es als Zeichenfolge behandeln, wird der Code, der dem Null-Beendigungszeichen gehorcht, als Nullzeichenfolge behandelt. Dies ist jedoch nicht dasselbe wie das Löschen der Daten. Wenn Sie die Daten tatsächlich löschen möchten, müssen Sie memset verwenden.

2
tvanfosson

Wie wäre es mit dem folgenden:

bzero(my_custom_data,40);
1
codeconnundrum

Ich dachte, indem ich das erste Element setzte. zu einer Null würde die gesamte .__ löschen. Inhalt eines Char-Arrays.

Das ist nicht richtig, wie Sie entdeckt haben

Dies setzt jedoch nur das erste Element auf null.

Genau!

Sie müssen memset verwenden, um alle Daten zu löschen. Es reicht nicht aus, einen der Einträge auf null zu setzen.

Wenn ein Element des Arrays auf null gesetzt wird, bedeutet dies jedoch etwas Besonderes (z. B. bei Verwendung eines nullenden Strings), reicht es möglicherweise aus, das erste Element auf null zu setzen. Auf diese Weise wird jeder Benutzer des Arrays verstehen, dass es leer ist, obwohl das Array noch die alten Zeichen im Speicher enthält

1
hhafez

setzen Sie das erste Element auf NULL. Wenn Sie das Zeichen-Array drucken, erhalten Sie nichts zurück.

1
Bryan

Ich mache das normalerweise einfach so: 

memset(bufferar, '\0', sizeof(bufferar));
0