struct TM time;vs TM time = {}.输出相同但不相同?
struct tm time; vs tm time = {}. Same output but not the same?
我在这个叫做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
与
tm time = {}; // second code
现在,这就是我发现非常令人困惑的地方。第一个代码和第二个代码在我的控制台上给出了完全相同的答案。我也通过做typeid(days[time.tm_wday](.name((检查了结果的类型(days[time.tm_wday](,两个答案似乎完全相同。
但是,当提交到 Kattis 网站时,它只接受第二个,不接受第一个。
现在,谁能告诉我我在这里错过了什么?为什么它只接受一个对另一个?谢谢!
编辑:关于Kattis的一些信息:有一个问题,你必须通过编程来解决它。然后它会将您的答案与他们的答案进行核对。如果您的程序输出相同的答案,它将"接受"您的解决方案。如果它不同,那么它就没有。
例如,假设问题是计算正方形的面积。它给出了几个带有值的示例。
例如(情况 1:(输入:5 输出:25(。
如果您的控制台在输入 5 时输出 25,则它"接受"您的解决方案。如果它输出一些随机数,如 10,那么它不接受。
我的程序的特点是它输出完全相同的值:
第一个代码输出:星期四。第二个代码输出:星期四等。 但是,只有一个被认为是"正确的"。
有两个区别在起作用:
struct tm time; // (1)
对
tm time = {}; // (2)
1struct
在C语言中,复合类型的名称包括struct
关键字"struct tm
"。在C++中,类型名称本身就足够了,这里的"tm
";但为了兼容性起见,它可以由struct
作为前缀。更多关于: C++ 中"struct"和"typedef struct"之间的区别?
因此,关于struct
关键字,实际上只有外观上的区别。
2. 启动
(1)
定义了类型tm
的变量time
。由于tm
是一个 POD,因此不会对其进行初始化。使用未初始化的值通常会导致未定义的行为。(2)
定义并列表初始化类型为tm
的变量time
。这反过来又将tm
初始化为零,并且程序的行为是明确定义的。
更多内容:以下短语在C++中是什么意思:零初始化、默认值初始化和值初始化?
为什么重要?
未完全初始化time
然后调用mktime(&time);
会导致未定义的行为。一切都可能发生。每次运行程序时都可能不同,它可能取决于所使用的确切编译器、它所链接的库、操作系统、硬件、任何东西,一切。它也可以按预期工作。更多关于这一点:未定义、未指定和实现定义的行为。
我怀疑该程序在您的环境中偶然运行,但在目标上失败。
- 应用程序崩溃并显示"symbol _ZdlPvm, version Qt_5 not defined in file libQt5Core.so.5 with link time reference"
- C++:如何将 unix 时间的字符串转换为 *tm?(使用时间错误:"cannot convert 'String' to 'tm*' ")
- 为什么我会收到"Run-Time Check Failure #2 - Stack around the variable 'pr' was corrupted"错误?
- 解析某些行的文本和输出"time of appearance"
- 如何在不使用 std::tm 和 mktime() 的情况下为给定日历日期创建 chrono::time_point 对
- 如何比较两个tm(来自ctime)变量
- 返回time()库函数的数据类型
- 如何将 time-uuid(存储在 boost uuid 中)转换为时间戳/自纪元以来的时间?
- 如何从 boost::p osix_time::p time 获取秒数
- 调用 dll 函数时"Run-Time Check Failure #0 - The value of ESP"
- C++ SRAND(time(0)) 在猜谜游戏中不起作用
- 即使包含 <time.h 后仍"‘CLOCK_PER_SEC’ was not declared in this scope"错误>
- struct TM time;vs TM time = {}.输出相同但不相同?
- C++ std::tm 从 std::chrono::time_point 转换后返回错误的值
- 将 OLE 自动化日期 (OADate) 双精度转换为结构 tm,而不使用 VariantTime到SystemTime
- 使用 Windows 寄存器查找下一个"Daylight Saving Time"
- c++ get millsecond time
- "Feature X requires run-time support"的含义是什么?
- 如何传递以 "size determined at run time" 作为引用的动态分配数组?
- 在c++中调用time会改变我的结构体tm