web-dev-qa-db-fra.com

effacer un tableau de caractères c

J'ai pensé qu'en définissant le premier élément sur une valeur nulle, le contenu entier d'un tableau de caractères serait effacé.

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

Toutefois, cela ne définit que le premier élément sur null.

ou

my_custom_data[0] = 0; 

plutôt que d'utiliser memset, j'ai pensé que les 2 exemples ci-dessus devraient effacer toutes les données.

96
ant2009

Cela dépend de la façon dont vous voulez voir le tableau. Si vous visualisez le tableau sous la forme d'une série de caractères, le seul moyen d'effacer les données consiste à toucher chaque entrée. memset est probablement le moyen le plus efficace d'y parvenir.

D'autre part, si vous choisissez d'afficher cela en tant que chaîne C/C++ terminée par un caractère null, la définition du premier octet sur 0 effacera effectivement la chaîne.

104
JaredPar

Un tableau en C est simplement un emplacement de mémoire. En conséquence, votre affectation my_custom_data[0] = '\0'; définit simplement le premier élément à zéro et laisse les autres éléments intacts.

Si vous voulez effacer tous les éléments du tableau, vous devrez visiter chaque élément. C'est à cela que memset est destiné:

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

C'est généralement le moyen le plus rapide de s'en occuper. Si vous pouvez utiliser C++, considérez std :: fill à la place:

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

Pourquoi penseriez-vous que définir un seul élément effacerait tout le tableau? Si vous définissez le premier élément sur zéro (ou n'importe quelle valeur), c'est exactement ce que vous avez fait, et rien de plus.

Lors de l'initialisation, vous pouvez définir un tableau sur zéro:

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

Sinon, je ne connais aucune technique autre que le memset ou quelque chose de similaire.

22
abelenky

Utilisation:

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

Ou:

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

Essayez le code suivant:

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

Pourquoi ne pas utiliser memset()? Voilà comment le faire.

Définir le premier élément laisse le reste de la mémoire intact, mais les fonctions str traiteront les données comme vides.

7
John Fricker

Pls trouver ci-dessous où j'ai expliqué avec des données dans le tableau après le cas 1 et le cas 2.

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

Cas 1: 

sc_ArrData[0] = '\0';

Résultat:

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

Cas 2: 

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

Résultat:

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

Bien que régler le premier argument sur NULL fasse l'affaire, il est conseillé d'utiliser memset 

6
AKN

Nan. Tout ce que vous faites est de définir la première valeur sur '\ 0' ou 0.

Si vous travaillez avec des chaînes à zéro terminal, dans le premier exemple, vous obtiendrez un comportement qui imite ce que vous attendiez, mais la mémoire est toujours définie.

Si vous souhaitez effacer la mémoire sans utiliser memset, utilisez une boucle for.

4
Alan

Vous devriez utiliser memset. Définir uniquement le premier élément ne fonctionnera pas, vous devez définir tous les éléments. Sinon, comment définir uniquement le premier élément sur 0?

3
Michael

C'est exactement ce que fait l'écriture d'un caractère nul sur le premier caractère. Si vous le traitez comme une chaîne, le code obéissant au caractère de fin null le traitera comme une chaîne nulle, mais ce n'est pas la même chose que d'effacer les données. Si vous voulez effacer les données, vous devrez utiliser memset.

2
tvanfosson

Que diriez-vous de ce qui suit:

bzero(my_custom_data,40);
1
codeconnundrum

J'ai pensé en définissant le premier élément à zéro effacerait la totalité contenu d'un tableau de caractères.

Ce n'est pas correct comme vous l'avez découvert

Cependant, cela ne définit que le premier élément à null.

Exactement!

Vous devez utiliser memset pour effacer toutes les données, il ne suffit pas de définir l'une des entrées sur null.

Toutefois, si définir un élément du tableau sur null signifie quelque chose de spécial (par exemple, lorsque vous utilisez une chaîne de terminaison null), il peut être suffisant de définir le premier élément sur null. De cette manière, tout utilisateur du tableau comprendra qu'il est vide même s'il contient toujours les anciens caractères en mémoire.

1
hhafez

définissez le premier élément sur NULL. imprimer le tableau de caractères ne vous rendra rien.

1
Bryan

J'ai l'habitude de faire comme ça: 

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