2009-03-11 14 views
77

Pensé que al establecer el primer elemento en un nulo se borraría todo el contenido de una matriz de caracteres.borrar una matriz de caracteres c

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

Sin embargo, esto solo establece el primer elemento como nulo.

o

my_custom_data[0] = 0; 

en lugar de utilizar memset, pensé que el 2 ejemplos anteriores deberían borrar todos los datos.

+1

Jared, ¿por qué configuró la etiqueta C++? habló sobre "C" y no agregó ninguna etiqueta relacionada con C++. –

+1

Esto se aplica igualmente a las matrices de caracteres en C++, aunque él no especificó. –

+3

He eliminado la etiqueta C++ para evitar lo que ya hemos visto con personas que ofrecen soluciones específicas de C++ – Alnitak

Respuesta

92

Depende de cómo quiera ver la matriz. Si está viendo la matriz como una serie de caracteres, la única forma de borrar los datos es tocar cada entrada. memset es probablemente la forma más efectiva de lograr esto.

Por otro lado, si elige ver esto como una cadena terminada nula en C/C++, establecer el primer byte en 0 borrará la cadena de forma efectiva.

+0

lol Creo lo mismo cuando vi que +1 – hhafez

+4

La palabra clave en la respuesta es "efectivamente". Solo el primer elemento se establece en 0 y el resto aún tiene valores indefinidos, pero si se trata la matriz como una cadena terminada nula y el primer elemento es nulo, la cadena se considera vacía. –

+0

de hecho, esta es la respuesta amigos. –

3

Debe usar memset. Configurar solo el primer elemento no funcionará, debe configurar todos los elementos; de lo contrario, ¿cómo podría establecer solo el primer elemento en 0?

+0

memset no debe utilizarse sobre la legibilidad: http://stackoverflow.com/questions/453432/difference-in-initalizing- and-zeroing-an-array-in-cc/455137 # 455137 –

+0

¿Desde cuándo no se podía leer memset? – Inisheer

4

No. Todo lo que está haciendo es establecer el primer valor en '\ 0' o 0.

Si está trabajando con cadenas terminadas nulas, en el primer ejemplo obtendrá un comportamiento que imita lo que esperaba, sin embargo, la memoria todavía está configurado.

Si desea borrar la memoria sin usar memset, use un ciclo for.

+0

Digo no en el ciclo for. Trate de no escribir sus propias funciones de biblioteca "mejoradas" (y normalmente no). De hecho, memset y memcpy son bastante especiales, a menudo están incorporados en el código de máquina personalizado para la CPU en función de lo que se conoce acerca de la alineación y longitud de los datos. –

+0

@ Zan OP no quiere usar memset (quizás está incrustado y no lo tiene disponible). Pero sí, memset suele ser muy óptimo, y probablemente más rápido que un bucle for. –

+0

Cierto, sin embargo, no quería usar memset, así que sugerí un ciclo for. – Alan

2

Escribir un carácter nulo para el primer personaje hace precisamente eso. Si lo trata como una cadena, el código que obedece al carácter de terminación nula lo tratará como una cadena nula, pero eso no es lo mismo que borrar los datos. Si desea borrar los datos, deberá usar memset.

59

Una matriz en C es solo una ubicación de memoria, de hecho, su asignación my_custom_data[0] = '\0'; simplemente establece el primer elemento en cero y deja intactos los otros elementos.

Si desea borrar todos los elementos de la matriz, deberá visitar cada elemento. Eso es lo que memset es para:

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

Esta es generalmente la forma más rápida de hacerse cargo de esto. Si usted puede utilizar C++, considere std :: llenar su lugar:

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

Creo que la segunda versión debería ser: std :: fill (arr, arr + sizeof (arr)/sizeof (arr [0]), 0); –

+0

Aclaración: no use sizeof con relleno porque luego tendrá problemas con arreglos de int, long, double o lo que sea. –

+0

Prefiero: std :: fill (y arr [0], & arr [arr_len], 0); –

7

Por qué no usar memset()? Así es como hacerlo.

La configuración del primer elemento deja intacto el resto de la memoria, pero las funciones str tratarán los datos como vacíos.

+1

No use memset sobre legibilidad: http://stackoverflow.com/questions/453432/difference-in-initalizing-and-zeroing-an-array-in-c-c/455137#455137 –

+1

y ¿cuál es su respuesta? – mkb

22

¿Por qué crees que configurar un solo elemento borraría toda la matriz? En C, especialmente, poco ocurre sin que el programador lo programe explícitamente. Si configura el primer elemento como cero (o cualquier valor), habrá hecho exactamente eso y nada más.

Al inicializar puede establecer una matriz a cero:

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

De lo contrario, no sé cualquier técnica que no sea memset, o algo similar.

+0

Supongo que esto depende del compilador que usa – cocoafan

+0

@cocoafan: No, no depende del compilador. Es parte de la especificación del lenguaje. Cualquier compilador que se comporta de manera diferente no está siguiendo el lenguaje C. – abelenky

+0

No lo sabía, gracias. No pude encontrar ningún recurso donde pueda leer este caso especial. Sería bueno tenerlo como un marcador. – cocoafan

1

pensé fijando el primer elemento a un nulo sería borrar todo el contenido de un matriz de caracteres.

Eso no es correcta al descubierto

Sin embargo, esto sólo se establece el primer elemento de en nulo.

¡Exactamente!

Necesita usar memset para borrar todos los datos, no es suficiente establecer una de las entradas como nula.

Sin embargo, si establecer un elemento de la matriz como nulo significa algo especial (por ejemplo, cuando se usa una cadena de terminación nula), puede ser suficiente establecer el primer elemento como nulo. De esta manera cualquier usuario de la matriz comprenderá que es vacío, aunque la matriz todavía incluye los antiguos caracteres en la memoria

+0

No utilice "memset" sobre la legibilidad: http://stackoverflow.com/questions/453432/difference-in-initalizing-and-zeroing-an-array-in-cc/455137 # 455137 –

10

Uso:

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

O:

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

establece el primer elemento a NULL imprimir la matriz de caracteres no te devolverá nada.

6

Prueba el siguiente código:

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

FYI - Sancionar el código por 4 espacios o seleccionarlo y presionar el botón 'código', que se ve como dos líneas de binario. – meagar

-4

Pruebe lo siguiente:

strcpy(my_custom_data,""); 
5

Pls encuentra por debajo de donde he explicado con datos de la matriz tras caso 1 & el caso 2.

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

Caso 1:

sc_ArrData[0] = '\0'; 

Resultado:

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

Caso 2:

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

Resultado:

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

Aunque la configuración primer argumento a NULL hará el truco, usando memset es aconsejable

-3
void clearArray (char *input[]){ 
    *input = ' '; 
} 
+1

Esto no es CLEARING, solo está configurando el primer carácter en ''! Creo que querías escribir * input = '\ 0' – stviper

0

por lo general sólo lo hacen de esta manera:

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