Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/136.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 结构时间;vs tm time={}。输出相同但不相同?_C++_Struct_Tm_Ctime - Fatal编程技术网

C++ 结构时间;vs tm time={}。输出相同但不相同?

C++ 结构时间;vs tm time={}。输出相同但不相同?,c++,struct,tm,ctime,C++,Struct,Tm,Ctime,我在这个叫Kattis的网站上做了一些编程问题。以下是我正在做的问题的链接: 当我试图解决这个问题时,我发现了一些非常非常奇怪的事情 在我开始之前,这里有两个代码: 第一个: #include <iostream> #include <ctime> #include <string> using namespace std; int main() { //a = day, b = month string days[7] = {"Sunda

我在这个叫Kattis的网站上做了一些编程问题。以下是我正在做的问题的链接:

当我试图解决这个问题时,我发现了一些非常非常奇怪的事情

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

第一个:

#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;
}
vs

tm time = {}; // second code
现在,这就是我发现的非常令人困惑的地方。第一个代码和第二个代码在我的控制台上给出了完全相同的答案。我还通过执行typeid(days[time.tm\u wday]).name()检查了结果的类型(days[time.tm\u wday]),两个答案似乎完全相同

然而,当提交到Kattis网站时,它只接受第二个,不接受第一个

现在,有人能告诉我我错过了什么吗?为什么它只接受一对另一?多谢各位

编辑: 关于Kattis的一些信息:有一个问题需要通过编程来解决。然后它会将你的答案与他们的答案进行核对。如果您的程序输出相同的答案,它将“接受”您的解决方案。如果它不同,那么它就不一样了

例如,假设问题是计算正方形的面积。它给出了几个带有值的示例

例1:(输入:5输出:25)

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

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

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

有两个区别:

struct tm time; // (1)

tm time = {}; // (2)
1
struct
在C语言中,复合类型的名称包括
struct
关键字,
struct tm
。在C++中,类型的名称本身就足够了,“<代码> TM <代码>”但出于兼容性考虑,它可以以
struct
作为前缀。关于这方面的更多信息:

因此,关于
struct
关键字,实际上只有表面上的区别

2.初始化
(1)
定义
tm
类型的变量
time
。由于
tm
为,因此未初始化。使用未初始化的值通常会导致未定义的行为。
(2)
定义和列表初始化
tm
类型的变量
time
。这反过来会初始化
tm
,程序的行为也会得到很好的定义

关于这方面的更多信息:

为什么这很重要? 未完全初始化
time
,然后调用
mktime(&time)导致未定义的行为。一切都可能发生。每次运行程序时可能会有所不同,这取决于所使用的确切编译器、它所链接的libs、操作系统、硬件、任何东西,一切。它也可以按预期工作。更多信息:


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

您所说的“接受”是什么意思?第一个变量没有正确初始化
tm
,因此您得到了未定义的行为。@NeilButterworth我添加了一些关于Kattis@VTT第一个和第二个都输出完全相同的字符串。
struct tm
不是一个POD,而是一个结构。然而,如果没有一个定义的构造函数,你说它未初始化的说法是正确的,而OPs问题的关键是。@jwm为什么你认为结构不能是PODs?是一个类(类/结构/联合)类型,它是普通的标准布局,没有非静态的非POD成员
tm
完全符合此定义。顺便说一句,答案链接到POD的相同定义,“没有定义的构造函数”不是问题所在。没有用户定义构造函数的非POD类型将由表达式
T初始化
,使用。修改我上面的评论,注意
T
将调用编译器生成的
T()
构造函数,但它不会初始化内置类型的成员(例如,
int
数据成员)。
tm time = {}; // (2)