Foros del Web » Programación para mayores de 30 ;) » C/C++ »

Imprimir typedef C

Estas en el tema de Imprimir typedef C en el foro de C/C++ en Foros del Web. Hola gente de forosdelweb!,de esta manera me coje varios datos ilimitados Cita: #include <stdio.h> #include <string.h> typedef struct{ char nom[20]; }datos; int main(void){ datos unElement; ...
  #1 (permalink)  
Antiguo 01/06/2013, 06:40
 
Fecha de Ingreso: diciembre-2011
Mensajes: 414
Antigüedad: 12 años, 4 meses
Puntos: 1
Imprimir typedef C

Hola gente de forosdelweb!,de esta manera me coje varios datos ilimitados

Cita:
#include <stdio.h>
#include <string.h>
typedef struct{
char nom[20];
}datos;
int main(void){
datos unElement;
while(!feof(stdin)){
scanf("%c",unElement.nom);
}
return 0;
}
Como puedo hacer para imprimirlos ? Con Control+D deja de introducirse datos :)

Gracias !! :)
  #2 (permalink)  
Antiguo 01/06/2013, 07:50
 
Fecha de Ingreso: agosto-2012
Mensajes: 601
Antigüedad: 11 años, 8 meses
Puntos: 83
Respuesta: Imprimir typedef C

"...me coje varios datos ilimitados...

while(!feof(stdin)){
scanf("%c",unElement.nom);

..."

Bueno, tecnicamente solo te coge caracteres aislados en un bucle que solo finalizará cuando se produzca un error en la lectura de los datos del stream de entrada (es decir nunca, o casi nunca). Supongo que ya has echo la prueba de entrar mas de un caracter: el resultado de entrar 'hola' + enter hace que el scanf lea (leer de stdin implica quitar del buffer de entrada) el caracter 'h' y continue, como no se llego al final de stdin reentra n el ciclo y lee el segundo caracter 'o' y vuelve a comprobar si llegó al final de stdin, y asi hasta dar con el salto de linea del enter pero que tampoco finaliza el bucle (enter no provoca un eof para el stdin).


"...Como puedo hacer para imprimirlos?..."

Con printf puedes sacar datos por pantalla; ahora ten en cuenta el codigo que estas usando para guardar los datos entrados: aun cuando lo guardes en un char[20] solo estas escaneando caracter por caracter, es decir que para cada scanf se guardara solo el primer caracter encontrado en stdin, dicho de otra forma si entras 'kfh' en el primer ciclo se asignara unElement.nom[0] => 'k', el el segundo ciclo unElement.nom[0] => 'f', etc.. pero siempre se guardará un solo caracter en la primera posicion del array de caracteres que proporcionas. Aplicado al codigo que has colgado equivale a decir que estas malgastando 19 bytes porque nunca los vas a usar.

Si quieres entrar mas de un caracter debes usar el modificador %s, pero antes deberias leer el manual de scanf para ver como se comporta esa funcion: sconf solo lee de stdin (repito, leer de stdin implica sacar del bufer de entrada) los tipos de datos pedidos, es decir que si pides un caracter %c y entras 'hola' se ejecutará 4 veces hasta dar con el salto de linea; si pides un texto simple con %s leerá los datos hasta dar con un caracter espacio ' ' y dejará todo lo demas.

Prueba lo siguiente:

Código:
typedef struct{
	char nom[20];
	char cognom[20];
} usuari;


int main() {
	usuari actual;
	while(!feof(stdin)){
		printf("Qui ets:");
		
		scanf("%s",actual.nom);
		scanf("%s",actual.cognom);
		
		printf("%s %s\n", actual.nom, actual.cognom);
	}
	return 0;
}
Si entras 'kfh 1992' el primer scanf lee solo 'kfh' dejando '1992' como siguiente dato de stdin, y el segundo scanf lee '1992'. Si entras 'kfh 1992 test' el primer scanf cargará 'kfh' en 'nom', el segundo scanf cargará '1992' en 'cognom', mostrará lo entrado, saltará de ciclo y el nuevo primer scanf cargará 'test' en 'nom' y se detendrá a la espera del nuevo enter ok?

Si quieres escanear los dos datos de una sola pasada puedes usar el scanf con dos modificadores scanf("%s %s", nom, cognom), de forma que scanf esperará que entres una palabra + un espacio + otra palabra.

La otra opcion es escanear los datos de stdin con fgets que intentará guardar todos los datoes de stdin hasta el tamaño que le hayas indicado

Código:
usuari actual;

fgets(actual.nom, sizeof(actual.nom), stdin);
printf("%s", actual.nom);
Esto guardará en 'nom' 20 caracteres (incluyendo espacios) o lo que haya hasta que encuentre el primer salto de linea.

Puedes matizar un poco mas lo que intentas hacer?

Saludos
vosk
  #3 (permalink)  
Antiguo 01/06/2013, 10:08
 
Fecha de Ingreso: diciembre-2011
Mensajes: 414
Antigüedad: 12 años, 4 meses
Puntos: 1
Respuesta: Imprimir typedef C

Pues si , y gracias por las respuestas :)

Lo que intento hacer es recojer X cadenas de caracteres y que este cuando salga del programa imprima los datos correspondientes.

Pero gracias :)
  #4 (permalink)  
Antiguo 01/06/2013, 10:38
 
Fecha de Ingreso: agosto-2012
Mensajes: 601
Antigüedad: 11 años, 8 meses
Puntos: 83
Respuesta: Imprimir typedef C

Puedes usar una lista de estructuras para guardar todos los datos entrados, y luego tienes las dos opciones que te comente para ingresar los textos.

La struct ya la tienes, solo has de declarar un array de structs

Código:
typedef struct {
    char nom[20];
} datos;

datos lista[10];
Esto te permite guardar de forma facil 10 textos de 20 caracteres cada una; pero ojo: solo 10, eso implica que no puedes usar un bucle infinito. Si quieres usar un bucle infinito debereas usar listas dinamicas que te permitan ampliar el numero de structs hasta que finalice la aplicacion o hasta que te quedes sin memoria; si acaso esto dejalo para mas adelante, de momento trabaja con 10 structs para ver como funciona.

Sabiendo que solo podras guardar 10 textos, cambias el bucle infinito por un for y vas cargando los datos. Ahora es donde tienes las dos opciones que te comente: si quieres guardar datos de forma ordenada (mas o menos ordenada) puedes usar el scanf con varios modificadores para 'cazar' los datos en una sola frase. Si solo quieres guardar datos sin importar lo que haya puedes usar el fgets para cargar todo lo que se ha escrito hasta el salto de linea (o hasta el tamaño indicado). Algo asi

Código:
typedef struct {
    char nom[20];
    int edat;
} datos;

datos lista[10];
int q;

for(q = 0; q < 10; q++) {
    printf("Dato #%d en formato <nombre> <edad>: ", q);
    scanf("%s %d", lista[q].nom, &lista[q].edat);
}
Cuando finaliza el ciclo ya tienes la lista con los 10 usuarios y la edad de cada usuario. Para imprimirlos haces el mismo ciclo pero printando los valores:

Código:
for(q = 0; q < 10; q++) {
    printf("%s %d\n", lista[q].nom, &lista[q].edat);
}
Saludos
vosk
  #5 (permalink)  
Antiguo 03/06/2013, 08:14
 
Fecha de Ingreso: diciembre-2011
Mensajes: 414
Antigüedad: 12 años, 4 meses
Puntos: 1
Respuesta: Imprimir typedef C

Gracias , ya lo he logrado !! :)

Etiquetas: int, string, struct
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 23:47.