Discussion:
como inicializar un struct d cadenas
(demasiado antiguo para responder)
HADES
2004-01-08 17:47:32 UTC
Permalink
hola me he creado una estructura de la siguiente manera:
#define Maxanimal 40

struct Registroanimal{
int habitat,clase,ovi;
long int num;
float peso,taman;
char especie[10],obs[60],orden[14];
}animal[Maxanimal];

Bueno pues necesito inicializar los 15 primeros registros, el peso,
tamaño,clase,habitat...en fin todos los numeros estan facil con un
bucle y un random; pero a los que son cadenas de caracteres como lo
hago? me estoy comiendo la olla pero no se me ocurre nada, a ver si me
podeis hechar una manilla.
GRACIAS.
Miguel
2004-01-08 18:49:19 UTC
Permalink
char * especies[] = {"uiyreuyrewyrhgbuiyf", "fhfhf", "mnnnbm"};

para k entre 0 y Maxanimal-1 y j un random entre 0 y 2

strcpy(animal[k].especie, strlen(especies[j]) < 10 ? especies[j] : "");
jakala
2004-01-08 21:09:04 UTC
Permalink
otra forma:

strcpy(animal[num], "");

y la dejas en blanco. :P


Jakala
Post by Miguel
char * especies[] = {"uiyreuyrewyrhgbuiyf", "fhfhf", "mnnnbm"};
para k entre 0 y Maxanimal-1 y j un random entre 0 y 2
strcpy(animal[k].especie, strlen(especies[j]) < 10 ? especies[j] : "");
Martin J. Sanchez
2004-01-09 17:41:37 UTC
Permalink
HADES escribió en mensaje ...
Post by HADES
#define Maxanimal 40
struct Registroanimal{
int habitat,clase,ovi;
long int num;
float peso,taman;
char especie[10],obs[60],orden[14];
}animal[Maxanimal];
Bueno pues necesito inicializar los 15 primeros registros, el peso,
tamaño,clase,habitat...en fin todos los numeros estan facil con un
bucle y un random; pero a los que son cadenas de caracteres como lo
hago? me estoy comiendo la olla pero no se me ocurre nada, a ver si me
podeis hechar una manilla.
Podrias hacer algo como:

for(i=0; i<sizeof(animal); i++) {
char buffer[30];
sprintf( buffer, "Espe_%d", i);
strncpy( animal[i].especie, buffer, sizeof(animal[i].especie));
sprintf( buffer, "Orden_%d", i);
strncpy( animal[i].orden, buffer, sizeof(animal[i].orden));
... etc ...
}

Un saludo,
Martin.
Miguel
2004-01-09 19:03:32 UTC
Permalink
Post by Martin J. Sanchez
for(i=0; i<sizeof(animal); i++) {
char buffer[30];
sprintf( buffer, "Espe_%d", i);
strncpy( animal[i].especie, buffer, sizeof(animal[i].especie));
siempre que

strlen(buffer) < sizeof(animal[i].especie)

ya que ese es el único caso en que strncpy() copiará una string... creo.
Saludos.
--
Miguel.

"Tristeza não tem fin,..."
Martin J. Sanchez
2004-01-09 21:00:25 UTC
Permalink
Post by Miguel
Post by Martin J. Sanchez
for(i=0; i<sizeof(animal); i++) {
char buffer[30];
sprintf( buffer, "Espe_%d", i);
strncpy( animal[i].especie, buffer, sizeof(animal[i].especie));
siempre que
strlen(buffer) < sizeof(animal[i].especie)
ya que ese es el único caso en que strncpy() copiará una string... creo.
Saludos.
strncpy copiara un maximo de sizeof(animal[i].especie) chars
independientemente del tamaño de la string fuente. El problema se
plantea si (strlen(buffer)+1) es mayor o igual que
sizeof(animal[i].especie), en cuyo caso, strncpy no copiara el nul
final (por que no cabe en el espacio especificado).

Pare garantizar el nul final, lo habitual es hacer::
strncpy( dest, fuente, size_dest)
(o strncpy( dest, fuente, size_dest-1))
seguido de:
dest[size_dest-1]='\0':

Un saludo,

Martin.
Fernando Arbeiza
2004-01-09 19:47:50 UTC
Permalink
On Fri, 09 Jan 2004 18:41:37 +0100, Martin J Sanchez
Post by Martin J. Sanchez
strncpy( animal[i].especie, buffer, sizeof(animal[i].especie));
Sólo una cosita por si alguien no lo sabe (y para que lo tenga en
cuenta).

strncpy(dest, orig, n)

tiene dos comportamientos que quizá no sean lo que se espera:

- Si dentro de los n caracteres de orig no está el carácter nulo, no
se copiará ese carácter en dest. Por lo tanto, puede suceder que
dest acabe dejando de ser un string.

- Si orig es más corto de n caracteres, se escribirá el carácter
nulo en dest hasta llegar a n. Por cierto, ahora no se me ocurre
qué utilidad han pensado que puede tener esto, ¿alguien lo sabe?.

Un saludo.
--
Fernando Arbeiza <URL: mailto:***@ono.com>
Crea tu propio Linux: <URL: http://www.escomposlinux.org/lfs-es>
jakala
2004-01-10 14:41:47 UTC
Permalink
yo la utilidad que le veo a strncpy es que puedes copiar un numero
determinado de caracteres en el destino.

parece una tonteria, pero si por ejemplo tienes definido un struct con
cadenas de caracteres:

typedef struct datos{
int clave;
char nombre[10];
...
}misdatos;

y quieres "aprovechar" al maximo el espacio del struct... pues copias
el numero de caracteres que quieres en el campo Nombre (por ejemplo).

Eso si, como bien dices, ya que el comportamiento puede no ser el esperado
(sobretodo por el fin de cadena) interesa luego copiarlo a una cadena
auxiliar
para poder imprimirlo.
pero vamos, aprovechar el espacio lo aprovechas... :P

Jakala
Post by Fernando Arbeiza
On Fri, 09 Jan 2004 18:41:37 +0100, Martin J Sanchez
Post by Martin J. Sanchez
strncpy( animal[i].especie, buffer, sizeof(animal[i].especie));
Sólo una cosita por si alguien no lo sabe (y para que lo tenga en
cuenta).
strncpy(dest, orig, n)
- Si dentro de los n caracteres de orig no está el carácter nulo, no
se copiará ese carácter en dest. Por lo tanto, puede suceder que
dest acabe dejando de ser un string.
- Si orig es más corto de n caracteres, se escribirá el carácter
nulo en dest hasta llegar a n. Por cierto, ahora no se me ocurre
qué utilidad han pensado que puede tener esto, ¿alguien lo sabe?.
Un saludo.
--
Crea tu propio Linux: <URL: http://www.escomposlinux.org/lfs-es>
Loading...