Autor
|
Tema: Inicializar cadena de caracteres en lenguaje C. (Leído 6,237 veces)
|
NOB2014
Desconectado
Mensajes: 366
|
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.
|
|
|
En línea
|
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
Desconectado
Mensajes: 1.603
|
Con memset de string.h
|
|
|
En línea
|
|
|
|
geeke
Desconectado
Mensajes: 93
|
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};
|
|
|
En línea
|
|
|
|
AlbertoBSD
Programador y
Moderador Global
Desconectado
Mensajes: 3.696
🏴 Libertad!!!!!
|
Después de declarar una cadena de caracteres en C
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
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); debug("-c3\t",c3,10); debug("-c3\t",c3,10); debug("-c5\t",c5,10); } void debug(char *s,unsigned char *ptr,unsigned int l,...) { va_list args; int i = 0; char *buffer; buffer = calloc(len ,sizeof(char)); printf("%s: 0x%x ",buffer ,ptr ); while(ptr && i < l) { } }
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
|
|
« Última modificación: 12 Mayo 2016, 23:36 pm por AlbertoBSD »
|
En línea
|
|
|
|
NOB2014
Desconectado
Mensajes: 366
|
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]; size_t i; for( i=0; i<5; i++ ){ } return 0; }
Saludos.
|
|
|
En línea
|
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
Programador y
Moderador Global
Desconectado
Mensajes: 3.696
🏴 Libertad!!!!!
|
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
|
|
|
En línea
|
|
|
|
geeke
Desconectado
Mensajes: 93
|
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.
|
|
|
En línea
|
|
|
|
NOB2014
Desconectado
Mensajes: 366
|
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.
|
|
|
En línea
|
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
Programador y
Moderador Global
Desconectado
Mensajes: 3.696
🏴 Libertad!!!!!
|
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
|
|
|
En línea
|
|
|
|
NOB2014
Desconectado
Mensajes: 366
|
Hola, Alberto. ...pero si te pidieron manejar conversiones de cadena a número.... 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.
|
|
|
En línea
|
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.-
|
|
|
|
|