[编程语言][C语言]C语言巨坑

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的描述是一致的。因此,最好同样赋值为一个负值。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值