首先要说的是,我在编程中是一个绝对的菜鸟,所以它可能是一个非常简单的事情,我没有得到它。
我想知道从一天开始以来已经过了多少时间,为此我使用了time()
函数。
然后我要打印它,这是我的问题:第一个printf变量seconds
正确打印但在第二个printf
(我打印mills
和{{ 1}})它给了我错误的输出。
代码:
seconds
输出:
#include <stdio.h>
#include <time.h>
int main(void) {
long long int mills, seconds;
mills = time(NULL);
printf("Mills: %i\n", mills );
seconds = mills / 1000;
//here the variable is printed correctly
printf("Seconds: %i\n", seconds );
//here mills gets printed correctly but seconds gets printed as 0
printf("Milliseconds since midnight: %i\nSeconds since midnight: %i\n", mills, seconds);
return 0;
}
为什么第一次正确打印变量而不是第二次?不应该总是一样吗?
答案 0 :(得分:6)
通过long long int
打印printf
值需要%lld
(或%lli
)格式。您使用的是%i
,这是错误的。行为未定义。
答案 1 :(得分:0)
要获得午夜以来的秒数,您需要找到自纪元以来的秒数并将其修改为一天中的秒数,然后减去转换为当地时区的秒数:
#include <time.h>
#include <stdlib.h>
#include <stdio.h>
int main(void)
{
time_t current_time;
char* c_time_string;
/* Obtain current time. */
current_time = time(NULL);
if (current_time == ((time_t)-1))
{
(void) fprintf(stderr, "Failure to obtain the current time.\n");
exit(EXIT_FAILURE);
}
/* Convert to local time format. */
c_time_string = ctime(¤t_time);
if (c_time_string == NULL)
{
(void) fprintf(stderr, "Failure to convert the current time.\n");
exit(EXIT_FAILURE);
}
/* Print to stdout. ctime() has already added a terminating newline character. */
(void) printf("Current time is %s", c_time_string);
(void) printf("Seconds since midnight is %li", current_time%86400 - 18000);
exit(EXIT_SUCCESS);
}
我减去18000使其显示自东部时区午夜以来的秒数:)
答案 2 :(得分:0)
请使用%lld
或%lli
打印long long int
,您使用的%i
只能与int
一起使用。它会导致未定义的行为。< / p>
您的编译器应该警告过您
格式
%i
需要int
类型的参数,但参数2的类型为long long int
如果没有,请启用[-Wformat=]
警告。
同时查看此问题cross-platform printing of 64-bit integers with printf
首先printf
让你工作正常,你很不走运,这些事情经常会被取消检查并在以后造成伤害,通常会更好地启用额外警告并更正你的代码。