C/Visual C - comprensión del loop

 
Vista:
sin imagen de perfil

comprensión del loop

Publicado por Diego (150 intervenciones) el 17/04/2014 18:17:00
Buen dia, tengo una duda:
acabo de leer klo siguiente:
La función scanf retorna el número de datos de entrada asignados, que puede ser menor que ofrecido, incluso cero, en el caso de un error de asignación. Si un error de entrada ocurre antes de cualquier conversión, la función fscanf retorna el valor de la macro EOF.

Si lo comprendí bien, cuando se produce un error en la carga (dato de tipo distinto al esperado) retorna el valor de EOF;


Ejecuto el siguiente programa pero no comprendo bien porque cae en un loop infinito cuando se produce un error en la carga.
Este es el enunciado:
Dado el siguiente programa que lee fechas en formato dd/mm/yyyy, analice qué sucede
si envía como entrada una letra en vez de un número. Analice una solución a partir de
la funcionalidad de scanf.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
#include <stdio.h>
int main()
{
	int res, dia, mes, anio;
	do
	{
		res = scanf(" %2d/ %2d/ %4d", &dia, &mes, &anio);
		printf("scanf retorno %d\n", res);
		if (res != EOF)
		{
			if (res != 3)
			{
				printf("ERROR: El formato debe ser dd/mm/yyyy\n");
                                // res = EOF;
                               // continue;
			}
			else
			{
			printf("Fecha: %d/ %d/ %d\n", dia, mes, anio);
			}
		}
	}
	while (res != EOF);
	return 0;
}

Por lo que vi scanf retorna 0; no se bien porque devuelve el valor de los datos asignados y no devuelve el valor de EOF;

Intenté repararlo de las dos maneras en la que hize el comentario; el igualar el res con EOF hace que se detenga, pero no creo que esa sea la solución porque sino el do while quedaria inútil; en cuanto al continue no funcionó y tambien cae en el loop infinito.

Supongo que se espera que si es incorrecta la fecha se pida ingresarla nuevamente y no que termine si se equivoca colocando una letra, ya que con números se puede volver a ingresar nuevamente la fecha.

Les agradezco.
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

comprensión del loop

Publicado por Chema (234 intervenciones) el 17/04/2014 23:12:49
Se debe respetar íntegramente char mask[] = "##/##/####";

formato permitido ejemplo: 27/10/1965 y pulsar intro

Esto es un ejemplo que puede mejorar notablemente.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
int main(void){
	char mask[] = "##/##/####";
	char st[15];
	int size;
	int i;
	char c;
	int er = 0;
	int date[3];
	int n=0;
	char *p;
 
	size = strlen(mask);
 
	scanf("%s",st);
 
	for(i = 0; i < size+1; i++){
		c = st[i];
		if(er)
			break;
		switch (mask[i]) {
			 case '#':
				if (!isdigit(c))
					er = 1;
                     break;
            default:
				if (mask[i] != c)
					er = 1;
                     break;
		}
	}
 
	if(er){
		printf("Entrada no coincide con mascara");
                                         return 10;
	}
 
	p = st;
	for(i= 0 ;i < 3; i++){
		while(*p && *p != '/' ){
			n = n *10+ *p -'0';
		p++;
	}
		date[i] = n;
		n = 0;
		p++;
	}
 
	printf("Dia = %d Mes= %d Anio= %d",date[0],date[1],date[2]);
	return 0;
}
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar