为什么第一次而不是第二次正确打印变量“秒”?

时间:2017-02-03 17:34:38

标签: c printf

首先要说的是,我在编程中是一个绝对的菜鸟,所以它可能是一个非常简单的事情,我没有得到它。

我想知道从一天开始以来已经过了多少时间,为此我使用了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;

}

为什么第一次正确打印变量而不是第二次?不应该总是一样吗?

3 个答案:

答案 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(&current_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让你工作正常,你很不走运,这些事情经常会被取消检查并在以后造成伤害,通常会更好地启用额外警告并更正你的代码。