C语言学习8-标准库函数

一、什么是标准库函数?

标准库函数是指那些在任何平台上都被支持、且功能保持一致的函数。这使得同一份源代码在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);

四、关键要点总结

  1. sprintf/sscanf:用于字符串格式化和解析,注意sscanf返回值表示成功解析的字段数
  2. rand/srand:生成随机数前需要用srand设置种子,通常使用time(NULL)作为种子
  3. 时间处理
    • time()获取当前时间戳
    • localtime()将时间戳转换为详细时间结构
    • mktime()将时间结构转换为时间戳
    • 注意年份和月份的转换规则(年份-1900,月份-1)

这些标准库函数保证了代码的跨平台兼容性,是C语言编程中的重要工具。

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • php usleep() 函数延迟代码执行若干微秒。 unpack() 函数从二进制字符串对数据进行解包。 uni...
    思梦PHP阅读 6,143评论 1 24
  • 1.水仙花数 2.二维数组 3.二维数组赋值 4.输出二维数组的值 这里存在数组越界的情况,但是c 与 Java不...
    任振铭阅读 2,312评论 1 0
  • 总结了一些开发中常用的函数: usleep() //函数延迟代码执行若干微秒。 unpack() //函数从二进制...
    ADL2022阅读 3,332评论 0 3
  • usleep() 函数延迟代码执行若干微秒。unpack() 函数从二进制字符串对数据进行解包。uniqid() ...
    知码客阅读 1,693评论 0 0
  • PHP常用函数大全 usleep() 函数延迟代码执行若干微秒。 unpack() 函数从二进制字符串对数据进行解...
    上街买菜丶迷倒老太阅读 5,209评论 0 20

友情链接更多精彩内容