102 votes

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; 
 

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

110voto

JaredPar Points 333733

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 est de toucher chaque entrée. memset est probablement le moyen le plus efficace d'y parvenir.

D'un autre côté, 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.

69voto

John Feminella Points 116878

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 ce à quoi 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);
 

23voto

abelenky Points 28063

Pourquoi pensez-vous que définir un seul élément effacerait tout le tableau? En C, en particulier, rien ne se passe sans que le programmeur le programme explicitement. 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.

4voto

Alan Points 21367

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 terminées par null, 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.

3voto

Michael Points 34110

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?

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X