首页 > 代码库 > 《你必须知道的495个C语言问题》笔记--库函数
《你必须知道的495个C语言问题》笔记--库函数
怎样把数字转为字符串(与atoi相反)?有itoa函数吗?
用sprintf就可以了:
sprintf(string, "%d", number);同理,也可以同sprintf把long型或浮点型转换成字符串(使用%ld或%f),也就是说,可以把sprintf看成是atol或者atof的
反函数。
怎样在日期上加n天?怎样取得两个日期的时间间隔?
第一个问题,mktime接受没有规范话的日期,所以可以用一个日期的struct tm结构,直接在tm_mday域上进行加减,然后
调用mktime进行规范化,同时也返回了time_t值。但是主要不要超过tm中成员域的最大表示范围。
实践如下:
在2014/5/16日上加20天。
#include <stdio.h> #include <time.h> int main(void) { struct tm tm1; tm1.tm_year = 2014 - 1900; tm1.tm_mon = 5 - 1; tm1.tm_mday = 16; tm1.tm_hour = tm1.tm_min = tm1.tm_sec = 0; tm1.tm_isdst = 0; tm1.tm_mday += 20; if (mktime(&tm1) == -1) { } else { printf("%d/%d/%d\n",tm1.tm_year+1900, tm1.tm_mon+1, tm1.tm_mday); } return 0; }运行结果:
2014/6/5
第二个问题,可以使用mktime的返回值time_t,然后调用difftime获取他们的差值。
实践如下:
获取2014/5/16 到2014/6/5值
#include <stdio.h> #include <time.h> int main(void) { struct tm tm1,tm2; tm1.tm_year = 2014 - 1900; tm1.tm_mon = 5 - 1; tm1.tm_mday = 16; tm1.tm_hour = tm1.tm_min = tm1.tm_sec = 0; tm1.tm_isdst = 0; tm2.tm_year = 2014 - 1900; tm2.tm_mon = 6 - 1; tm2.tm_mday = 5; tm2.tm_hour = tm1.tm_min = tm1.tm_sec = 0; tm2.tm_isdst = 0; time_t t1,t2; t1 = mktime(&tm1); t2 = mktime(&tm2); long d = difftime(t2,t1)/86400; printf("%ld\n",d); return 0; }运行结果:
20
如何生成随机数?
使用rand函数。
#include <stdlib.h> #include <stdio.h> int main(void) { printf("%d\n", rand()); return 0; }但是每次运行的结果都是相同的:
1804289383
为了避免每次产生的随机数序列相同,通常用srand((unsigned)time(0))或者srand((unsigned)time(NULL))来产生种子:
rand()在每次被调用的时候,它会查看:
1)如果用户在此之前调用过srand(seed),给seed指定了一个值,那么它会自动调用srand(seed)一次来初始化它的起始值。
2) 如果用户在此之前没有调用过srand(seed),它会自动调用srand(1)。
所以上面的程序每次执行结果都是相同的。下面添加srand调用:
#include <stdlib.h> #include <stdio.h> int main(void) { srand((unsigned)time(NULL)); printf("%d\n", rand()); return 0; }执行结果:
1307772800
2067487507
但是如果在同一时间运行(精确到秒),则还是会出现相同的现象。
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。