Inicializar cadena de caracteres en lenguaje C.

Iniciado por NOB2014, 12 Mayo 2016, 21:38 PM

0 Miembros y 3 Visitantes están viendo este tema.

NOB2014

Hola, gente.
Después de declarar una cadena de caracteres en C ¿se puede inicializar todos los elementos a cero, sin tener que realizarlo a través de un bucle?. -

Saludos.
abraza las cosas y personas malas como si fueran tu mas preciada joya,Son tus mas grandes maestros de paciencia sabiduría y amor y cuando lo abrazas dejan de causar dolor.-

MAFUS


geeke

Si en verdad quieres evitar los bucles puedes:

char cadena[10] = "";

El cual es equivalente a

char cadena[10] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0};

AlbertoBSD

#3
Cita de: NOB2014 en 12 Mayo 2016, 21:38 PM
Después de declarar una cadena de caracteres en C

Cita de: Geeke en 12 Mayo 2016, 22:52 PM
Si en verdad quieres evitar los bucles puedes:

char cadena[10] = "";

El cual es equivalente a

char cadena[10] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0};

Creo que no es necesariamente equivalente, pero puede funcionar.

Puede servir la siguiente función

memset()

memset(cadena,0,longitud);

Hice el siguiente código para mostrar la función

#include<stdio.h>
#include<stdarg.h>
#include<stdlib.h>
#include<string.h>

void debug(char*s,unsigned char *ptr,unsigned int l,...);

int main() {
char c1[10] = "";
char c2[10] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; //No es dinamica pero esta en 0s
char *c3 = malloc(10); //Puede estar en 0s
char *c4 = calloc(10,1); //Ya lo inicializa en 0s
char c5[10] = "Texo Texto";

debug("c1\t",c1,10);
debug("c2\t",c2,10);
debug("c3\t",c3,10);
debug("c4\t",c4,10);
debug("c5\t",c4,10);
memset(c3,'A',10);
debug("-c3\t",c3,10);
memset(c3,0,10);
debug("-c3\t",c3,10);
memset(c5,0,10);
debug("-c5\t",c5,10);
}

void debug(char *s,unsigned char *ptr,unsigned int l,...) {
va_list args;
int i = 0;
int len = strlen(s)*20;
char *buffer;
buffer = calloc(len,sizeof(char));
va_start(args, l);
vsprintf(buffer,s, args);
printf("%s: 0x%x ",buffer,ptr);
while(ptr && i < l) {
printf("%.2x",ptr[i++]);
}
printf("\n");
va_end(args);
memset(buffer,0,len);
free(buffer);
}


La función debug (propia) para mostrar el estado de la memoria

Salida

c1      : 0x23fe30 00000000000000000000
c2      : 0x23fe20 00000000000000000000
c3      : 0x621390 e05a6200000000005001
c4      : 0x6213b0 00000000000000000000
c5      : 0x6213b0 00000000000000000000
-c3     : 0x621390 41414141414141414141
-c3     : 0x621390 00000000000000000000
-c5     : 0x23fe10 00000000000000000000
Donaciones
1Coffee1jV4gB5gaXfHgSHDz9xx9QSECVW

NOB2014

Hola.
Muchas gracias a los tres.
Geeke, lo tuyo no me funciona, ya lo había probado y cuando quiero hacer un bucle para demostrar que los 5 elementos contienen ceros, me muestra un solo cero. -
AlbertoBSD , que puedo decirte, gracias por el aporte. -   
En definitiva, como dijo MAFUS, con memset me funciona perfecto. -

#include <stdio.h>
#include <string.h>

int main( void ){
char a[5];
memset(a, '0', 5);
size_t i;

for( i=0; i<5; i++ ){
printf( "%c ", a[i] );
}

return 0;
}



Saludos.
abraza las cosas y personas malas como si fueran tu mas preciada joya,Son tus mas grandes maestros de paciencia sabiduría y amor y cuando lo abrazas dejan de causar dolor.-

AlbertoBSD

Ahora creo que algunos nos confundimos por que por tu codigo tu te referias al 0 en su forma ascii y no al valor 0 o nulo.

Igualmente memset funciana para cualquier valor.

'0' != 0

Saludos
Donaciones
1Coffee1jV4gB5gaXfHgSHDz9xx9QSECVW

geeke

Cita de: NOB2014 en 12 Mayo 2016, 23:59 PM
Geeke, lo tuyo no me funciona, ya lo había probado y cuando quiero hacer un bucle para demostrar que los 5 elementos contienen ceros, me muestra un solo cero. -

Si usas el especificador %c sólo imprimirá espacios porque el contenido del array es 0 == '\0' != '0' el carácter null generalmente se representa mediante un espacio, pero si cambias el especificador a %d se imprimirán los ceros

Por ultimo en estos casos es preciso ser especificos porque podria surgir ambiguedades, tal como vemos en este caso, el cero tiene diferentes significados esto dependiendo del contexto donde se lo usa.

NOB2014

Hola, Deeke.
Muy bien, tienes razón, lo que muestra es coherente:
48 0 0 0 0
Igual me queda una duda, lo que estoy haciendo es una calculadora y necesito cada elemento con cero (no con el final de cadena), hice una práctica de esta forma y el resultado es correcto.
a[2] = 5;
y me muestra:
48 0 5 0 0
Bueno esa es la duda, ¿en todos los casos el resultado será correcto? o tendré de todas maneras que igualar todos los elementos a 0. -   

Un abrazo.
abraza las cosas y personas malas como si fueran tu mas preciada joya,Son tus mas grandes maestros de paciencia sabiduría y amor y cuando lo abrazas dejan de causar dolor.-

AlbertoBSD

Depende de como manejes la calculadora y que es lo que quieras hacer.

Define un formato y apegate a ese.

lo deal seriaa manera valores int para los numeros. pero si te pidieron manejar conversiones de cadena a numero entonces las cadenas limpialas con el valor 0 y no con el ascii '0'.

Repito dependiendo de lo que quieras hacer puede ser mas facil una u otra
Donaciones
1Coffee1jV4gB5gaXfHgSHDz9xx9QSECVW

NOB2014

Hola, Alberto.
Citar...pero si te pidieron manejar conversiones de cadena a número....
:laugh: :laugh: :laugh: evidentemente, no leíste mi perfil, tengo 64 años y soy autodidacta (de esta manera nos conocemos un poco más). -
Todo comenzo con este post http://foro.elhacker.net/programacion_cc/array_de_punteros_a_funcion_fltmin_fltmax_c-t452042.0.html  y como llegue a la conclusión que no podía validar que el ingreso sea correcto y al no poder ingresar una cantidad respetable de dígitos, (la que estoy haciendo acepta 100 dígitos) me puse a programar una calculadora, estoy un tanto trabado pero seguramente lo voy a lograr, cuento con vuestra ayuda. -

Saludos.
abraza las cosas y personas malas como si fueran tu mas preciada joya,Son tus mas grandes maestros de paciencia sabiduría y amor y cuando lo abrazas dejan de causar dolor.-