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的描述是一致的。因此,最好同样赋值为一个负值。
本文详细介绍了C标准库中的scanf()函数使用方法及注意事项,避免因换行符导致的输入错误。同时深入探讨了mktime()函数的应用场景,特别是t.tm_isdst参数的正确设置方法。
2154

被折叠的 条评论
为什么被折叠?



