C标准库
scanf()
函数
scanf("%d", &num);
这一语句是从缓冲区中读取一个整数并且赋值给num,如果紧跟其后有语句scanf("%c", &ch);
则ch被赋值给换行符(ASCII值为0xA),从控制台上感觉如同跳过了对ch的读值赋值操作。
实际上,scanf()
函数在读取一行后,会有一个换行符一并保存在缓冲区。对num赋值后换行符仍然保留在缓冲区中,为了让程序能够正常运行,通常可以在scanf()
函数之后调用getchar()
函数,以丢弃缓冲区中的换行符。
mktime()
函数
struct std::tm t;
t.tm_year = year - 1900;
t.tm_mon = month - 1;
t.tm_mday = day;
t.tm_hour = hour;
t.tm_min = minute;
t.tm_sec = second;
//t.tm_isdst = -1;
std::time_t tt = std::mktime(&t);
if (tt == -1)
{
std::stringstream sstream;
sstream << "Invalid system time(std::tm.tm_isdst = ";
sstream << t.tm_isdst;
sstream << ")";
throw sstream.str();
}
如果没有给t.tm_isdst
赋值,则t.tm_isdst
的值是不确定的,可能是正值、负值或0。如果为正值,则mktime()
函数认为t.tm_isdst
指示该时间是夏时令有效;如果是0,则mktime()
函数认为t.tm_isdst
指示该时间是夏时令无效;如果为负值,则mktime()
函数自己判断夏时令是否有效。在调用mktime()
函数时,应该给t.tm_isdst
赋值,最好是赋值为负值,让mktime()
函数自己判断。
出现问题的代码属于C++代码,在C中是否存在尚不确定。但是,对于t.tm_isdst
的描述是一致的。因此,最好同样赋值为一个负值。