Ver Mensaje Individual
  #2 (permalink)  
Antiguo 01/06/2013, 07:50
vosk
 
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