Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: NOB2014 en 12 Mayo 2016, 21:38 pm



Título: Inicializar cadena de caracteres en lenguaje C.
Publicado por: NOB2014 en 12 Mayo 2016, 21:38 pm
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.


Título: Re: Inicializar cadena de caracteres en lenguaje C.
Publicado por: MAFUS en 12 Mayo 2016, 22:19 pm
Con memset de string.h


Título: Re: Inicializar cadena de caracteres en lenguaje C.
Publicado por: geeke en 12 Mayo 2016, 22:52 pm
Si en verdad quieres evitar los bucles puedes:

Código
  1. char cadena[10] = "";

El cual es equivalente a

Código
  1. char cadena[10] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0};


Título: Re: Inicializar cadena de caracteres en lenguaje C.
Publicado por: AlbertoBSD en 12 Mayo 2016, 23:17 pm
Después de declarar una cadena de caracteres en C

Si en verdad quieres evitar los bucles puedes:

Código
  1. char cadena[10] = "";

El cual es equivalente a

Código
  1. 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

Código

Código
  1. memset(cadena,0,longitud);

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

Código
  1. #include<stdio.h>
  2. #include<stdarg.h>
  3. #include<stdlib.h>
  4. #include<string.h>
  5.  
  6. void debug(char*s,unsigned char *ptr,unsigned int l,...);
  7.  
  8. int main() {
  9. char c1[10] = "";
  10. char c2[10] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; //No es dinamica pero esta en 0s
  11. char *c3 = malloc(10); //Puede estar en 0s
  12. char *c4 = calloc(10,1); //Ya lo inicializa en 0s
  13. char c5[10] = "Texo Texto";
  14.  
  15. debug("c1\t",c1,10);
  16. debug("c2\t",c2,10);
  17. debug("c3\t",c3,10);
  18. debug("c4\t",c4,10);
  19. debug("c5\t",c4,10);
  20. memset(c3,'A',10);
  21. debug("-c3\t",c3,10);
  22. memset(c3,0,10);
  23. debug("-c3\t",c3,10);
  24. memset(c5,0,10);
  25. debug("-c5\t",c5,10);
  26. }
  27.  
  28. void debug(char *s,unsigned char *ptr,unsigned int l,...) {
  29. va_list args;
  30. int i = 0;
  31. int len = strlen(s)*20;
  32. char *buffer;
  33. buffer = calloc(len,sizeof(char));
  34. va_start(args, l);
  35. vsprintf(buffer,s, args);
  36. printf("%s: 0x%x ",buffer,ptr);
  37. while(ptr && i < l) {
  38. printf("%.2x",ptr[i++]);
  39. }
  40. printf("\n");
  41. va_end(args);
  42. memset(buffer,0,len);
  43. free(buffer);
  44. }
  45.  

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

Salida

Código:
c1      : 0x23fe30 00000000000000000000
c2      : 0x23fe20 00000000000000000000
c3      : 0x621390 e05a6200000000005001
c4      : 0x6213b0 00000000000000000000
c5      : 0x6213b0 00000000000000000000
-c3     : 0x621390 41414141414141414141
-c3     : 0x621390 00000000000000000000
-c5     : 0x23fe10 00000000000000000000


Título: Re: Inicializar cadena de caracteres en lenguaje C.
Publicado por: NOB2014 en 12 Mayo 2016, 23:59 pm
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. -

Código
  1. #include <stdio.h>
  2. #include <string.h>
  3.  
  4. int main( void ){
  5. char a[5];
  6. memset(a, '0', 5);
  7. size_t i;
  8.  
  9. for( i=0; i<5; i++ ){
  10. printf( "%c ", a[i] );
  11. }
  12.  
  13. return 0;
  14. }


Saludos.


Título: Re: Inicializar cadena de caracteres en lenguaje C.
Publicado por: AlbertoBSD en 13 Mayo 2016, 01:25 am
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


Título: Re: Inicializar cadena de caracteres en lenguaje C.
Publicado por: geeke en 13 Mayo 2016, 04:28 am
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.


Título: Re: Inicializar cadena de caracteres en lenguaje C.
Publicado por: NOB2014 en 13 Mayo 2016, 14:12 pm
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.


Título: Re: Inicializar cadena de caracteres en lenguaje C.
Publicado por: AlbertoBSD en 13 Mayo 2016, 14:51 pm
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


Título: Re: Inicializar cadena de caracteres en lenguaje C.
Publicado por: NOB2014 en 13 Mayo 2016, 15:38 pm
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.


Título: Re: Inicializar cadena de caracteres en lenguaje C.
Publicado por: AlbertoBSD en 13 Mayo 2016, 16:32 pm
A no sabia eso. Felicidades  ;-) ;-) ;-)

Es bueno ver personas tratando de aprender todos estos temas y superarse cada dia.

Sobre el tema de calculadora....

Tengo este topic:

http://foro.elhacker.net/programacion_cc/numeros_de_longitud_variable_en_c_numeros_muy_grandes-t451749.0.html (http://foro.elhacker.net/programacion_cc/numeros_de_longitud_variable_en_c_numeros_muy_grandes-t451749.0.html)

Donde la funcion puede procesar números de cualquier longitud sea un numero de 1000 digitos o de 1 Millon lo que sea lo maneja, actualmente ya esta un poco mas avanzado el código, tiene varios bugs solucionados y una excelente adminsitracion de memoria.

Por se quieres hechar un ojo.


Saludos!


Título: Re: Inicializar cadena de caracteres en lenguaje C.
Publicado por: NOB2014 en 13 Mayo 2016, 16:51 pm
Amigo, muchas gracias por enviarme a ese post, lo que ocurre es que tengo un largo puente que cruzar para acercarme a tus conocimientos, lo estuve leyendo y nota que son muchas cosas nuevas que por el momento no lograría ni continuar con lo mío ni interpetrar lo tuyo. -
Luego si sigo trabado, les consulto.-

Un abrazo.