tipos significa secuencias salida que para modificadores lenguaje funciones formato especificadores escape entrada datos c printf typedef time-t

significa - Especificadores de formato para tipos definidos por implementación como time_t



que significa 163 en c (4)

Quiero que mi código sea más independiente de la plataforma / implementación. No sé en qué momento se implementará un time_t en la plataforma cuando se compile el código. ¿Cómo sé el tipo de t para determinar qué especificador de formato usar?

... time_t t = time(NULL); printf("%s", t); ...


El estándar de C dice que time_t será un "tipo real" (es decir, un tipo de entero o un tipo de punto flotante, aunque en la práctica siempre es un tipo de entero).

Con time_t , su mejor apuesta es formatearlo con strftime() después de analizarlo con localtime() o gmtime() , esto se puede hacer de manera portátil.

Es indiscutible que debe determinar mediante algún mecanismo cuál es el especificador de formato correcto. Puede usar PRI_[Xxodi]_time y SCN_[Xxodi]_time o algo similar como no estándar pero casi estándar (sin pisotear el espacio de nombres reservado, que son nombres que comienzan con PRI o SCN seguidos de una letra minúscula o X). Utiliza algún mecanismo para especificar que ... encapsula la información no portátil en un lugar.


Generalmente, la forma de mostrar el valor de un time_t es dividir sus componentes en una struct tm usando gmtime o gmtime y mostrarlos o convertirlos como se desee con strftime , o ctime para ir directamente de time_t a una cadena que muestra la hora local.

Si desea ver el valor en bruto para algún propósito, el estándar C especifica que time_t es real , lo que significa que es un número entero o punto flotante (C 2011 (N1570) 6.2.5 17). Por lo tanto, debería poder convertirlo al double e imprimirlo. Existe la posibilidad de que time_t pueda representar valores que el double no puede, por lo que es posible que tenga que protegerse si desea cuidar las implementaciones exóticas. Como difftime devuelve la diferencia de dos objetos time_t como un double , parece que C no es realmente compatible con time_t con más precisión que un double .


Por lo general, puede usar una conversión para convertir el operando a algún tipo para el que sepa el formato correcto.

Su solución propuesta:

time_t t = time(NULL); printf("%s", t);

claramente no funcionará, ya que time_t es un tipo numérico, no char* .

Sabemos, en general, que time_t es un tipo aritmético. Algo como esto:

printf("%ld/n", (long)t);

Es probable que funcione en la mayoría de los sistemas. Puede fallar (a) si time_t es un tipo sin firma no más ancho que el unsigned long y el valor actual de t excede a LONG_MAX , o (b) si time_t es un tipo de punto flotante.

Si tiene soporte para C99, puede usar long long , que es un poco mejor:

printf("%lld/n", (long long)t);

Si realmente desea exagerar con la portabilidad, puede detectar qué tipo de tipo time_t es:

if ((time_t)-1 > 0) { // time_t is an unsigned type printf("%ju/n", (uintmax_t)t); } else if ((time_t)1 / 2 > 0) { // time_t is a signed integer type printf("%jd/n", (intmax_t)t); } else { // time_t is a floating-point type (I''ve never seen this) printf("%Lg/n", (long double)t); }

Es posible que desee ajustar el formato %Lg a algo como %Lf o %.10Lf , dependiendo del formato de salida que desee.

De nuevo, esto supone el soporte de C99, y necesitará #include <stdint.h> para que uintmax_t e intmax_t visibles.

time_t y clock_t son un poco inusuales, ya que el estándar solo dice que son de tipo aritmético capaces de representar tiempos. (En principio, podrían ser tipos complejos, pero yo diría que ignorar esa posibilidad merece la pena).

En la mayoría de los otros casos, es probable que sepa si un tipo dado está firmado, sin signo o en coma flotante, y puede convertirlo al tipo más ancho de ese tipo.

Tenga en cuenta que si no sabe cómo se representa time_t , es probable que tampoco comprenda la salida de printf (como 1379375215 ), a menos que su objetivo sea resolverlo.

(Si estuviera programando en C ++ en lugar de C, std::cout << t << "/n"; usaría automáticamente el operator<< sobrecargado correcto operator<< .)

Si desea una salida legible para el usuario (como Mon 2013-09-16 16:46:55 PDT ), querrá usar una de las funciones de conversión declaradas en <time.h> , como asctime() o strftime() .


Puedes usar difftime() para obtener un double :

time_t t = time(NULL); printf("seconds 1970->now: %.f/n", difftime(t, (time_t) 0));

Es simple y creo que es portátil.