Domanda

Ho pensato che impostando il primo elemento su null avrei cancellato l'intero contenuto di un array di caratteri.

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

Tuttavia, questo imposta solo il primo elemento su null.

o

my_custom_data[0] = 0; 

piuttosto che usare memset , ho pensato che i 2 esempi sopra dovrebbero cancellare tutti i dati.

È stato utile?

Soluzione

Dipende da come si desidera visualizzare l'array. Se stai visualizzando l'array come una serie di caratteri, l'unico modo per cancellare i dati è toccare ogni voce. memset è probabilmente il modo più efficace per raggiungere questo obiettivo.

D'altra parte, se si sceglie di visualizzarlo come stringa con terminazione null C / C ++, l'impostazione del primo byte su 0 cancella effettivamente la stringa.

Altri suggerimenti

Un array in C è solo una posizione di memoria, quindi in effetti il ??tuo my_custom_data [0] = '\ 0'; imposta semplicemente il primo elemento su zero e lascia intatti gli altri elementi.

Se vuoi cancellare tutti gli elementi dell'array, dovrai visitare ogni elemento. Questo è ciò che memset è per:

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

Questo è generalmente il modo più veloce per occuparsene. Se puoi usare C ++, considera invece std :: fill:

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

Perché pensi che l'impostazione di un singolo elemento cancella l'intero array? In C, in particolare, non succede mai nulla senza che il programmatore lo programmi esplicitamente. Se imposti il ??primo elemento su zero (o qualsiasi valore), allora hai fatto esattamente questo e niente di più.

Durante l'inizializzazione è possibile impostare un array su zero:

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

Altrimenti, non conosco alcuna tecnica diversa dal memset o qualcosa di simile.

Usa:

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

o

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

Prova il seguente codice:

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

Perché non usare memset () ? Ecco come farlo.

L'impostazione del primo elemento lascia intatto il resto della memoria, ma le funzioni str tratteranno i dati come vuoti.

Di seguito troverai dove ho spiegato con i dati nell'array dopo il caso 1 & amp; caso 2.

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

Caso 1:

sc_ArrData[0] = '\0';

Risultato:

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

Caso 2:

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

Risultato:

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

Sebbene l'impostazione del primo argomento su NULL farà il trucco, è consigliabile usare memset

No. Tutto quello che stai facendo è impostare il primo valore su '\ 0' o 0.

Se stai lavorando con stringhe con terminazione null, nel primo esempio otterrai un comportamento che imita ciò che ti aspetti, tuttavia la memoria è ancora impostata.

Se vuoi cancellare la memoria senza usare memset, usa un ciclo for.

Dovresti usare memset. Impostando solo il primo elemento non funzionerà, è necessario impostare tutti gli elementi; in caso contrario, come è possibile impostare solo il primo elemento su 0?

Scrivere un carattere null sul primo carattere fa proprio questo. Se lo tratti come una stringa, il codice che obbedisce al carattere di terminazione null lo tratterà come una stringa null, ma ciò non equivale a cancellare i dati. Se vuoi cancellare effettivamente i dati dovrai usare memset.

  

Ho pensato impostando il primo elemento   a un valore nullo cancellerebbe il tutto   contenuto di un array di caratteri.

Questo non è corretto come hai scoperto

  

Tuttavia, questo imposta solo il primo   elemento su null.

Esattamente!

È necessario utilizzare memset per cancellare tutti i dati, non è sufficiente impostare una delle voci su null.

Tuttavia, se l'impostazione di un elemento dell'array su null significa qualcosa di speciale (ad esempio quando si utilizza una stringa di terminazione null in), potrebbe essere sufficiente impostare il primo elemento su null. In questo modo qualsiasi utente dell'array capirà che è vuoto anche se l'array include ancora i vecchi caratteri in memoria

imposta il primo elemento su NULL. la stampa dell'array char non ti restituirà nulla.

Che ne dici di quanto segue:

bzero(my_custom_data,40);

Di solito faccio così:

memset(bufferar, '\0', sizeof(bufferar));
void clearArray (char *input[]){
    *input = ' '; 
}

Prova quanto segue:

strcpy(my_custom_data,"");
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top