结构时间; vs tm time = {}。相同的输出但不一样?

时间:2018-05-29 22:18:55

标签: c++ struct tm ctime

我在这个名为Kattis的网站上做了一些编程问题。以下是我正在做的问题的链接:https://open.kattis.com/problems/datum

当我试图解决这个问题时,我发现了非常非常非常奇怪的东西。

在开始之前,这里有两个代码:

第一个:

#include <iostream>
#include <ctime>
#include <string>

using namespace std;

int main()
{
    //a = day, b = month
    string days[7] = {"Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"};

    struct tm time;

    cin >> time.tm_mday >> time.tm_mon;

    time.tm_year = 2009-1900;
    time.tm_mon--;

    mktime(&time);

    cout << days[time.tm_wday] << endl;

    return 0;
}

第二个:

#include <iostream>
#include <ctime>
#include <string>

using namespace std;

int main() {
    //a = day, b = month
    string days[7] = {"Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"};

    tm time = {};

    cin >> time.tm_mday >> time.tm_mon;

    time.tm_year = 2009-1900;
    time.tm_mon--;

    mktime(&time);

    cout << days[time.tm_wday] << endl;

    return 0;
}

它们是完全相同代码,除了 这两个代码的唯一区别是:

struct tm time; // first code

VS

tm time = {}; // second code

现在,这是我发现非常令人困惑的事情。第一个代码和第二个代码在我的控制台上给出完全相同的答案。我通过执行typeid(days [time.tm_wday])。name()来检查结果的类型(days [time.tm_wday]),并且两个答案看起来完全相同。

但是,当提交到Kattis网站时,它只接受第二个,不接受第一个。

现在,谁能告诉我这里缺少什么?为什么它只接受一个与另一个?非常感谢你!

修改 关于Kattis的一些信息:有一个问题,你必须通过编程来解决它。然后它会检查你的回答。如果您的程序输出相同的答案,它“接受”您的解决方案。如果它不同,则不然。

例如,假设排队是计算正方形的面积。它给出了几个值的例子。

ex)案例1 :(输入:5输出:25)。

如果您的控制台在输入5时输出25,那么它“接受”您的解决方案。如果它输出一些随机数,如10,那么它不接受。

我的程序就是输出完全相同的值:

第一个代码输出:星期四。第二代码输出:星期四等 但是只有一个被认为是“正确的”。

1 个答案:

答案 0 :(得分:2)

有两个不同之处:

struct tm time; // (1)

tm time = {}; // (2)

1 struct

在C中,复合类型的名称包含struct关键字,&#34; struct tm&#34;这里。在C ++中,类型的名称本身就足够了,&#34; tm&#34;这里;但为了兼容性,它可以以struct为前缀。更多相关内容:Difference between 'struct' and 'typedef struct' in C++?

因此,关于struct关键字,实际上只有一个整容差异。

2。动初始化

(1)定义time类型的变量tm。由于tma POD,因此未初始化。使用未初始化的值通常会导致未定义的行为 (2)定义并列出初始化类型time的变量tm。这反过来零初始化 tm,并且程序的行为是明确定义的。

更多相关内容:What do the following phrases mean in C++: zero-, default- and value-initialization?

为什么重要?

未完全初始化time,然后调用mktime(&time);会导致未定义的行为。一切都会发生。每次运行程序时可能会有所不同,它可能取决于所使用的确切编译器,链接的库,操作系统,硬件,任何东西,一切。它也可以按预期工作。更多相关内容:Undefined, unspecified and implementation-defined behavior

我怀疑该程序在您的环境中偶然运行,但在目标上失败。