一、什么是標(biāo)準(zhǔn)庫(kù)函數(shù)?
標(biāo)準(zhǔn)庫(kù)函數(shù)是指那些在任何平臺(tái)上都被支持、且功能保持一致的函數(shù)。這使得同一份源代碼在Windows和Linux等不同平臺(tái)上編譯運(yùn)行的結(jié)果相同,無(wú)需修改代碼。
sprintf 與 sscanf
函數(shù)說(shuō)明
- sprintf - 將數(shù)據(jù)格式化為字符串(s代表string)
- sscanf - 從字符串中解析數(shù)據(jù)
使用示例
#include <stdio.h>
// sprintf 示例:格式化字符串
char buf[128];
sprintf(buf, "姓名:%s, 年齡:%d", "張三", 28);
// 或者動(dòng)態(tài)分配內(nèi)存
char* buf = (char*)malloc(128);
sprintf(buf, "姓名:%s, 年齡:%d", "張三", 28);
// sscanf 示例:解析字符串
// 返回值表示成功解析的字段數(shù)量
// 注意:sscanf更適合解析數(shù)字,解析字符串時(shí)需謹(jǐn)慎
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("日期格式錯(cuò)誤!\n");
}
二、rand 與 srand:隨機(jī)數(shù)生成
函數(shù)說(shuō)明
- rand - 生成隨機(jī)數(shù)
- srand - 設(shè)置隨機(jī)數(shù)種子
使用示例
#include <stdlib.h>
#include <time.h>
// 生成隨機(jī)數(shù)(每次運(yùn)行結(jié)果不同)
for (int i = 0; i < 10; i++) {
printf("%d\n", rand());
}
// 生成指定范圍內(nèi)的隨機(jī)數(shù)
// 示例1:生成100到159之間的隨機(jī)數(shù)
int random_num = rand() % 60 + 100;
// 示例2:生成0.00到1.00之間的小數(shù)
int rand_int = rand() % 100;
double rand_decimal = rand_int / 100.0;
// 實(shí)際應(yīng)用:七星彩號(hào)碼生成
srand(time(NULL)); // 用當(dāng)前時(shí)間設(shè)置隨機(jī)種子
int lottery_numbers[7]; // 一注7個(gè)數(shù)字
for (int i = 0; i < 7; i++) {
int digit = rand() % 10; // 0~9的隨機(jī)數(shù)
lottery_numbers[i] = digit;
}
三、時(shí)間處理函數(shù)
1. 獲取當(dāng)前系統(tǒng)時(shí)間
#include <time.h>
// 方法1:獲取時(shí)間戳
// time_t類(lèi)型通常是32位或64位整數(shù)
time_t current_time = time(NULL);
printf("當(dāng)前時(shí)間戳: %ld\n", (long)current_time);
2. 時(shí)間戳轉(zhuǎn)換為詳細(xì)時(shí)間信息
// 使用localtime函數(shù)將時(shí)間戳轉(zhuǎn)換為詳細(xì)時(shí)間
// 輸入:time_t指針
// 輸出:tm結(jié)構(gòu)體指針
struct tm* localtime(const time_t* time_ptr);
// tm結(jié)構(gòu)體定義
struct tm {
int tm_sec; // 秒: 0~59
int tm_min; // 分: 0~59
int tm_hour; // 時(shí): 0~23
int tm_mday; // 日: 1~31
int tm_mon; // 月: 0~11(使用時(shí)需+1)
int tm_year; // 年: 從1900開(kāi)始計(jì)算(使用時(shí)需+1900)
int tm_wday; // 星期: 0~6(0=星期日)
int tm_yday; // 年內(nèi)天數(shù): 0~365
};
// 轉(zhuǎn)換示例
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. 計(jì)算未來(lái)日期
// 示例:計(jì)算300天后的日期
time_t current = time(NULL);
time_t future = current + (300 * 24 * 3600); // 加上300天的秒數(shù)
struct tm future_info = *localtime(&future);
4. 時(shí)間信息轉(zhuǎn)換為時(shí)間戳
// 使用mktime函數(shù)將時(shí)間信息轉(zhuǎn)換為時(shí)間戳
time_t mktime(struct tm* time_ptr);
// 轉(zhuǎn)換函數(shù)示例
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);
}
// 實(shí)際應(yīng)用:計(jì)算兩個(gè)日期之間的天數(shù)差
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);
// 計(jì)算時(shí)間差(秒)
long time_diff = (long)(end_date - start_date);
// 轉(zhuǎn)換為天數(shù)
int days_diff = time_diff / (24 * 3600);
printf("兩個(gè)日期相差 %d 天\n", days_diff);
四、關(guān)鍵要點(diǎn)總結(jié)
- sprintf/sscanf:用于字符串格式化和解析,注意sscanf返回值表示成功解析的字段數(shù)
- rand/srand:生成隨機(jī)數(shù)前需要用srand設(shè)置種子,通常使用time(NULL)作為種子
-
時(shí)間處理:
- time()獲取當(dāng)前時(shí)間戳
- localtime()將時(shí)間戳轉(zhuǎn)換為詳細(xì)時(shí)間結(jié)構(gòu)
- mktime()將時(shí)間結(jié)構(gòu)轉(zhuǎn)換為時(shí)間戳
- 注意年份和月份的轉(zhuǎn)換規(guī)則(年份-1900,月份-1)
這些標(biāo)準(zhǔn)庫(kù)函數(shù)保證了代碼的跨平臺(tái)兼容性,是C語(yǔ)言編程中的重要工具。