2009-10-13 10 views
48

Tiene una matriz de caracteres como miembros de char [255]. ¿Cómo puedo vaciarlo completamente sin usar un bucle?¿Cómo vaciar una matriz de caracteres?

char members[255]; 

Por "vacío" quiero decir que si tuviera unos valores almacenados en él, entonces no debería. Por ejemplo, si lo hago strcat continuación antiguo valor no debe permanecer

members = "old value"; 

//empty it efficiently 
strcat(members,"new"); // should return only new and not "old value new" 
+2

¿Qué quiere decir "vaciar una matriz"? – pmg

+0

¿qué quieres decir con vacío? – giorgian

+1

Defina 'vacío'. –

Respuesta

105

usando

memset(members, 0, 255); 

en general

memset(members, 0, sizeof members); 

si la matriz es en su alcance, o

memset(members, 0, nMembers * (sizeof members[0])); 

si sólo tiene el valor del puntero, y nMembers es el número de elementos en la matriz.


EDITAR Por supuesto, ahora el requisito ha cambiado desde la tarea genérica de la limpieza de una matriz para restablecer puramente una cadena, memset es un exceso y acaba de puesta a cero de los primeros elementos de basta (como se ha señalado en otras respuestas).


EDITAR Para poder utilizar memset, tienes que incluyen string.h.

+4

+1 - Me gustaría ir por esto ya que asegura que todos los elementos de la matriz se encuentran en un estado conocido. – ChrisBD

+0

Sin embargo, va en contra del requisito (épico) de no usar un bucle. –

+1

Si bien memset probablemente no se implemente como una recursión, podría ser - en cualquier caso, la iteración queda decentemente oculta a la vista, que era el requisito aparente. –

2

me gustaría ir con

members_in_use = 0; 
+1

-1 eso no tiene ningún sentido. –

+0

En realidad, tiene mucho sentido, ya que el PO está pidiendo una operación (vaciado) que no forma parte de una matriz de C - por lo tanto, idealmente, tendría implementar una nueva estructura de datos, y PMG de manera de señalar la estructura es vacío es lo suficientemente bueno. –

+0

No, realmente no tiene ningún sentido. –

6

miembros char [255] = {0};

+2

-1 Eso es un inicializador, no vacía la matriz. –

+5

y me da menos después de que editó su pregunta – user44556

+0

Esta respuesta fue incorrecta antes de editar la pregunta. –

27

depende de lo que entendemos por 'vacío':

members[0] = '\0'; 
+1

Eso solo cambiaría el valor de los miembros [0], no de los miembros [1] a través de los miembros [254]. Está bien si está accediendo secuencialmente ... pero no tan bien en otros casos. –

+3

Después de la edición de OP parece que mi solución debería funcionar para sus requisitos, ya que strcat() encontrará el byte NULO y lo tratará como corresponde. – Felix

+0

sin embargo, memset parece ser una mejor solución –

3

EDIT: Dada la edición más reciente de la cuestión, esto ya no funcionará ya que no hay terminación null - si se trató para imprimir la matriz, obtendrá sus caracteres seguidos por una serie de caracteres no legibles por humanos. Sin embargo, dejo esta respuesta aquí como wiki de la comunidad para la posteridad.

char members[255] = { 0 }; 

Eso debería funcionar. De acuerdo con el lenguaje de programación C:

Si la matriz tiene un tamaño fijo, el número de inicializadores no puede exceder el número de miembros de la matriz; si hay menos, los miembros restantes se inicializan con 0.

Esto significa que cada elemento de la matriz tendrá un valor de 0. No estoy seguro de si eso es lo que se consideraría "vacío" o no, ya que 0 es un valor válido para char.

+1

-1 que es un inicializador. –

+0

Depende de cómo defina "vacío".El carácter con un valor de 0 no es un carácter legible por humanos y la matriz de caracteres está en un estado conocido. Yo consideraría eso vacío. También hace exactamente lo mismo que memset (si mi recuerdo de memset es correcto, ha pasado demasiado tiempo desde que usé C). –

0

Al "vaciar una matriz" si quiere decir reiniciar a 0, entonces puede usar bzero.

#include <strings.h> 
void bzero(void *s, size_t n); 

Si desea llenar la matriz con algún otro carácter predeterminado, entonces puede usar la función memset.

#include <string.h> 
void *memset(void *s, int c, size_t n); 
+0

bzero y memset (normalmente) ambos usan un bucle. –

3

No puede vaciar una matriz como tal, siempre contiene la misma cantidad de datos.

En un contexto más grande, los datos en la matriz pueden representar una lista vacía de elementos, pero eso debe definirse además de la matriz. La forma más común de hacerlo es mantener un recuento de los elementos válidos (vea la respuesta por pmg) o que las cadenas terminen con un carácter cero (la respuesta de Felix). También hay formas más complicadas, por ejemplo, un búfer en anillo usa dos índices para las posiciones donde se agregan y quitan los datos.

2
members[0] = 0; 

es suficiente, según sus necesidades.

Sin embargo, tenga en cuenta que esto no está "vaciando" el búfer. La memoria todavía está asignada, los valores de caracteres válidos pueden existir en ella, y así sucesivamente ..

+1

También se puede escribir como * members = 0; – eyalm

0

Descargo de responsabilidad: Normalmente no programo en C, por lo que puede haber alguna sintaxis encontrada en mis ejemplos, pero espero las ideas que trato de expresar son claras.

Si "vaciado" significa "que contienen una cadena vacía", sólo puede asignar el primer elemento de la matriz a cero, lo que efectivamente hacer que la matriz para contener una cadena de empry:

members[0] = 0; 

Si "vaciado" significa "liberar la memoria que está usando", en primer lugar, no debería usar una matriz de caracteres fija. Por el contrario, debe definir un puntero a char, y luego hacer malloc/free (o asignación de cadena) según corresponda.

Un ejemplo utilizando sólo cadenas estáticas:

char* emptyString=""; 
char* members; 

//Set string value 
members = "old value"; 

//Empty string value 
member = emptyString 

//Will return just "new" 
strcat(members,"new"); 
1

más simple es mejor - tiene sentido?

en este caso solo miembros [0] = 0 funciona. no hagas una pregunta simple tan complicada.

3

No se moleste en tratar de poner a cero su matriz de caracteres si está tratando con cadenas. A continuación se muestra una forma simple de trabajar con las cadenas de caracteres.

Copiar (asignar nueva cadena):

strcpy(members, "hello"); 

Concatenate (agregue la cadena):

strcat(members, " world"); 

Cadena vacía:

members[0] = 0; 

simple como eso.

2

Uso bzero(array name, no.of bytes to be cleared);

0

Usted puede usar la siguiente instrucción:

strcpy_s(members, ""); 
Cuestiones relacionadas