elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Recuerda que debes registrarte en el foro para poder participar (preguntar y responder)


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  Pasar string a time. Número de días entre dos fechas
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Pasar string a time. Número de días entre dos fechas  (Leído 4,162 veces)
capitandelpanel

Desconectado Desconectado

Mensajes: 1


Ver Perfil
Pasar string a time. Número de días entre dos fechas
« en: 9 Mayo 2015, 12:56 pm »

Buenas!

Necesito un programa que me calcule el número de días que faltan desde una fecha (que introduce el usuario por teclado) a la fecha actual. Por ahora lo que llevo echo es que me diga el día del año en el que estamos:

int main()
{
time_t tiempo,puntero;
char ,diaano[80],
int aux;
struct tm *tmPtr;

tiempo = time(NULL);
tmPtr = localtime(&tiempo);

strftime( diaano, 80, "%j", tmPtr);

printf("El dia del año es: %s\n", diaano );

aux = atoi( diaano );

return 0;
}


Ahora necesito hacer el mismo proceso con la fecha que introduce el usuario y luego restar estos dos números. Lo que no doy conseguido es pasar un string(la fecha que introduce el usuario) a un dato tipo time.

Asi mismo el programa también me tiene que saltar un aviso si la fecha que introducimos es anterior a la fecha actual.

¿alguna solución?

gracias


En línea

rir3760


Desconectado Desconectado

Mensajes: 1.639


Ver Perfil
Re: Pasar string a time. Número de días entre dos fechas
« Respuesta #1 en: 9 Mayo 2015, 16:58 pm »

Para obtener la diferencia (en segundos) de dos fechas puedes utilizar la función difftime, esta requiere dos argumentos de tipo time_t, el primero es la fecha actual y la obtienes mediante una llamada a la función time.

La segunda fecha la introduce el usuario, aquí puedes obtener directamente los valores de dia, mes y año para una estructura tipo "struct tm" y a partir de esta obtener uno de tipo time_t con mktime. Mas o menos así:
Código
  1. struct tm d = {0};
  2. time_t b;
  3.  
  4. puts("Introduce la fecha (aaaa mm dd):");
  5. if (scanf("%d %d %d", &d.tm_year, &d.tm_mon, &d.tm_mday) != 3)
  6.   return EXIT_FAILURE;
  7. d.tm_year -= 1900; /* 0 == 1900, 100 == 2000, etc. */
  8. d.tm_mon--; /* 0 == Enero, 1 == Febrero, etc. */
  9.  
  10. /* Validacion de los campos tm_year, tm_mon y tm_mday */
  11.  
  12. b = mktime(&d);
  13.  
  14. /* ... */

Un saludo


En línea

C retains the basic philosophy that programmers know what they are doing; it only requires that they state their intentions explicitly.
--
Kernighan & Ritchie, The C programming language
Peregring-lk

Desconectado Desconectado

Mensajes: 50


Ver Perfil
Re: Pasar string a time. Número de días entre dos fechas
« Respuesta #2 en: 17 Mayo 2015, 01:47 am »

Código
  1. #include "stdio.h"
  2. #include "time.h"
  3.  
  4. #define SEGS_DIA 86400
  5.  
  6. int main()
  7. {
  8.  struct tm fecha = {}; // Inicializamos la estructura a 0.
  9.  
  10.  // Asumimos que el formato de fecha introducido por el usuario es correcto.
  11.  printf("Introduce la fecha: ");
  12.  scanf("%u%u%u", &fecha.tm_mday, &fecha.tm_mon, &fecha.tm_year);
  13.  
  14.  --fecha.tm_mon; // La estructura tm numera los meses del 0 al 11.
  15.  fecha.tm_year -= 1900; // Los annos comienzan en 1900.
  16.  
  17.  // No utilizo difftime porque devuelve un `double` y me da coraje.
  18.  int diff = (mktime(&fecha) - time(NULL)) / SEGS_DIA;
  19.  
  20.  printf("\nLa diferencia es: %d\n", diff);
  21.  
  22.  return 1;
  23. }
  24.  

Si quisiéramos comprobar el formato de entrada mejor, el `scanf` sería algo más "complejo":

Código
  1. char truco;
  2.  
  3. int leidos = scanf("%2u%2u%4u%c", &fecha.tm_mday, &fecha.tm_mon, &fecha.tm_year, &truco);
  4.  
  5. if (leidos != 3)
  6.  exit(EXIT_FAILURE);
  7.  
  8. if (tm_year < 1000) // Asumimos que el anno debe tener al menos 4 digitos.
  9.  exit(EXIT_FAILURE);
  10.  

Los numeritos (el 2 o el 4) son para indicar el "ancho" máximo que tendrá cada campo. El otro "truco" (la `%c` final) sirve para evitar que el usuario introduzca cadenas más largas de la cuenta; por ejemplo: "24 11 19900asd". El formato de entrada sería correcto para `scanf`, porque los cuatro primeros dígitos del campo "año" se guardan correctamente.

El problema es que `scanf` deja de "leer" e ignora el resto de la cadena, así que lo forzamos a leer al menos uno más, y si ha recuperado 4, es que la cadena era demasiado larga.
« Última modificación: 17 Mayo 2015, 20:22 pm por Peregring-lk » En línea

rir3760


Desconectado Desconectado

Mensajes: 1.639


Ver Perfil
Re: Pasar string a time. Número de días entre dos fechas
« Respuesta #3 en: 1 Junio 2015, 16:47 pm »

El otro "truco" (la `%c` final) sirve para evitar que el usuario introduzca cadenas más largas de la cuenta; por ejemplo: "24 11 19900asd".
El especificador "%c" al igual que "%[]" no descartan el espacio blanco inicial, por ello una linea que consista de los tres numeros (validos) para la fecha seguida del avance de linea (lo usual) resultara en la función scanf retornando cuatro.

La aproximación mas sencilla (en este caso) es utilizar scanf para leer y validar los tres números, a continuación se utiliza un bucle con getchar para verificar que el resto solo sea espacio/tabulador/etc. seguidos del carácter '\n'.

O bien se puede utilizar solo scanf pero queda (en mi opinión) muy feo:
Código
  1. int leidos =
  2.   scanf("%2u%2u%4u", &fecha.tm_mday, &fecha.tm_mon, &fecha.tm_year) == 3
  3.   && (scanf("%*[ \t]"), scanf("%1[\n]", &truco) == 1)
  4. ;

Un saludo
En línea

C retains the basic philosophy that programmers know what they are doing; it only requires that they state their intentions explicitly.
--
Kernighan & Ritchie, The C programming language
Peregring-lk

Desconectado Desconectado

Mensajes: 50


Ver Perfil
Re: Pasar string a time. Número de días entre dos fechas
« Respuesta #4 en: 2 Junio 2015, 11:46 am »

Tienes razón en lo del carácter fin de línea. Mi solución es, quizás, más adecuada para cadenas recibidas como parámetro (`sscanf`), que para comprobar directamente la entrada. De todas formas, ¿no es ésta una solución más sencilla?

Código
  1. /* Con barras invertidas para que tenga más "pinta" de fecha :)
  2. leidos = scanf("%2u/%2u/%4u%c", &dia, &mes, &anno, &truco);
  3.  
  4. if (leidos < 3)
  5.     exit(EXIT_FAILURE);
  6.  
  7. if (leidos > 3 && truco != '\n'))
  8.    exit(EXIT_FAILURE);

De ésta forma, solo permitimos una fecha seguida inmediatamente por un salto de línea. No creo que haga falta comprobar todo lo que venga detrás, sencillamente, con obligar al usuario a escribir la fecha y luego justo después, pulsar "Intro", sería suficiente.
En línea

rir3760


Desconectado Desconectado

Mensajes: 1.639


Ver Perfil
Re: Pasar string a time. Número de días entre dos fechas
« Respuesta #5 en: 3 Junio 2015, 16:21 pm »

¿no es ésta una solución más sencilla?
En el caso que mencionas si, es mas corta.

Por cierto se puede abreviar un poco mas. Cuando la fecha para ser valida solo puede ser seguida del avance de linea puedes indicarlo en la cadena de formato con "%1[\n]" y verificar que el resultado de la función sea igual a cuatro. Mas o menos así:
Código
  1. if (scanf("%2u/%2u/%4u%1[\n]", &dia, &mes, &anno, &truco) == 4){
  2.   puts("OK");
  3. }else {
  4.   puts("Entrada no valida");
  5. }

Edito: Ups, el especificador "%[]" almacena los caracteres coincidentes seguidos de un '\0' por lo que el objeto destino no puede ser una variable de tipo char sino un array de estos (mea culpa).

Un saludo
« Última modificación: 3 Junio 2015, 16:33 pm por rir3760 » En línea

C retains the basic philosophy that programmers know what they are doing; it only requires that they state their intentions explicitly.
--
Kernighan & Ritchie, The C programming language
Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Calcular días entre dos fechas...
Ejercicios
*-.Sub-Vorbio.-* 0 5,006 Último mensaje 13 Noviembre 2008, 00:51 am
por *-.Sub-Vorbio.-*
Calcular numero de días entre dos fechas!
Java
*-.Sub-Vorbio.-* 9 40,076 Último mensaje 26 Marzo 2009, 23:34 pm
por Choclito
intervalo entre fechas
Programación Visual Basic
z_ane_666 4 2,714 Último mensaje 8 Noviembre 2011, 13:34 pm
por 79137913
Programa que calcule la diferencia de días entre dos fechas
Programación C/C++
davisinful 2 13,076 Último mensaje 10 Noviembre 2011, 00:57 am
por rir3760
Numero de dias que separan ambas fechas.
Programación C/C++
mario.ar 1 2,268 Último mensaje 8 Febrero 2013, 15:48 pm
por engel lex
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines