一、什么是标准库函数?
标准库函数是指那些在任何平台上都被支持、且功能保持一致的函数。这使得同一份源代码在Windows和Linux等不同平台上编译运行的结果相同,无需修改代码。
sprintf 与 sscanf
函数说明
- sprintf - 将数据格式化为字符串(s代表string)
- sscanf - 从字符串中解析数据
使用示例
#include <stdio.h>
// sprintf 示例:格式化字符串
char buf[128];
sprintf(buf, "姓名:%s, 年龄:%d", "张三", 28);
// 或者动态分配内存
char* buf = (char*)malloc(128);
sprintf(buf, "姓名:%s, 年龄:%d", "张三", 28);
// sscanf 示例:解析字符串
// 返回值表示成功解析的字段数量
// 注意:sscanf更适合解析数字,解析字符串时需谨慎
const char* date_text = "2015-12-13";
int year, month, day;
int parsed_count = sscanf(date_text, "%d-%d-%d", &year, &month, &day);
if (parsed_count != 3) {
printf("日期格式错误!\n");
}
二、rand 与 srand:随机数生成
函数说明
- rand - 生成随机数
- srand - 设置随机数种子
使用示例
#include <stdlib.h>
#include <time.h>
// 生成随机数(每次运行结果不同)
for (int i = 0; i < 10; i++) {
printf("%d\n", rand());
}
// 生成指定范围内的随机数
// 示例1:生成100到159之间的随机数
int random_num = rand() % 60 + 100;
// 示例2:生成0.00到1.00之间的小数
int rand_int = rand() % 100;
double rand_decimal = rand_int / 100.0;
// 实际应用:七星彩号码生成
srand(time(NULL)); // 用当前时间设置随机种子
int lottery_numbers[7]; // 一注7个数字
for (int i = 0; i < 7; i++) {
int digit = rand() % 10; // 0~9的随机数
lottery_numbers[i] = digit;
}
三、时间处理函数
1. 获取当前系统时间
#include <time.h>
// 方法1:获取时间戳
// time_t类型通常是32位或64位整数
time_t current_time = time(NULL);
printf("当前时间戳: %ld\n", (long)current_time);
2. 时间戳转换为详细时间信息
// 使用localtime函数将时间戳转换为详细时间
// 输入:time_t指针
// 输出:tm结构体指针
struct tm* localtime(const time_t* time_ptr);
// tm结构体定义
struct tm {
int tm_sec; // 秒: 0~59
int tm_min; // 分: 0~59
int tm_hour; // 时: 0~23
int tm_mday; // 日: 1~31
int tm_mon; // 月: 0~11(使用时需+1)
int tm_year; // 年: 从1900开始计算(使用时需+1900)
int tm_wday; // 星期: 0~6(0=星期日)
int tm_yday; // 年内天数: 0~365
};
// 转换示例
time_t now = time(NULL);
struct tm time_info = *localtime(&now);
int year = time_info.tm_year + 1900;
int month = time_info.tm_mon + 1;
int day = time_info.tm_mday;
int hour = time_info.tm_hour;
int minute = time_info.tm_min;
int second = time_info.tm_sec;
3. 计算未来日期
// 示例:计算300天后的日期
time_t current = time(NULL);
time_t future = current + (300 * 24 * 3600); // 加上300天的秒数
struct tm future_info = *localtime(&future);
4. 时间信息转换为时间戳
// 使用mktime函数将时间信息转换为时间戳
time_t mktime(struct tm* time_ptr);
// 转换函数示例
time_t convert_to_timestamp(int year, int month, int day,
int hour, int minute, int second)
{
struct tm time_info = {0};
time_info.tm_year = year - 1900; // 年份需要减去1900
time_info.tm_mon = month - 1; // 月份需要减去1
time_info.tm_mday = day;
time_info.tm_hour = hour;
time_info.tm_min = minute;
time_info.tm_sec = second;
return mktime(&time_info);
}
// 实际应用:计算两个日期之间的天数差
time_t start_date = convert_to_timestamp(2013, 2, 2, 0, 0, 0);
time_t end_date = convert_to_timestamp(2015, 4, 6, 0, 0, 0);
// 计算时间差(秒)
long time_diff = (long)(end_date - start_date);
// 转换为天数
int days_diff = time_diff / (24 * 3600);
printf("两个日期相差 %d 天\n", days_diff);
四、关键要点总结
- sprintf/sscanf:用于字符串格式化和解析,注意sscanf返回值表示成功解析的字段数
- rand/srand:生成随机数前需要用srand设置种子,通常使用time(NULL)作为种子
-
时间处理:
- time()获取当前时间戳
- localtime()将时间戳转换为详细时间结构
- mktime()将时间结构转换为时间戳
- 注意年份和月份的转换规则(年份-1900,月份-1)
这些标准库函数保证了代码的跨平台兼容性,是C语言编程中的重要工具。