• C 标准库 - <time.h>和<float.h>详解


    目录

    简介

    库变量

    库宏

    库函数

    简介

    库变量

    库宏

    库函数


    简介

    C 标准库中的 头文件提供了处理时间和日期的函数和类型定义。它包含了一些结构体和函数,可以用于获取系统当前的日期、时间,以及进行日期和时间的计算等操作。

    头文件中,常用的类型包括 struct tm 结构体,它用来表示一个日历时间,包括年、月、日、时、分、秒等成员;time_t 类型用来表示时间值,通常是一个整数,代表从某一固定时间点(通常是 1970 年 1 月 1 日)经过的秒数。

    中,还包含了一系列函数,比如用于获取当前时间的函数 time(),用于将时间转换为字符串表示的函数 strftime(),以及一些用于日期和时间运算的函数,比如计算时间差的函数 difftime() 等。

    总的来说, 头文件提供了一系列函数和类型,可以帮助程序员在 C 语言中方便地处理日期和时间,进行时间的获取、格式化输出、计算等操作。

    库变量

    下面是头文件 time.h 中定义的变量类型:

    • size_t:无符号整数类型,通常用于表示对象的大小。在 C 语言中,使用 sizeof 运算符可以返回对象或类型的大小,其结果就是 size_t 类型。
    • clock_t:用于存储处理器时间的类型。它通常被用来度量程序执行所花费的处理器时间,比如通过 clock() 函数来获取程序运行时间的信息。
    • time_t:用于存储日历时间的类型。time_t 类型通常被用来表示从某个固定时间点(通常是 1970 年 1 月 1 日)经过的秒数,常用于时间的表示和计算。
    • struct tm:用来保存时间和日期的结构体。它包含了年、月、日、时、分、秒等成员,可以方便地表示一个特定的时间点。在 C 语言中,通常使用 struct tm 结构体进行时间的表示和计算,比如获取系统当前时间,以及进行时间格式的转换等操作。

    tm 结构的定义如下:

    1. struct tm {
    2. int tm_sec; /* 秒,范围从 0 到 59        */
    3. int tm_min; /* 分,范围从 0 到 59        */
    4. int tm_hour; /* 小时,范围从 0 到 23        */
    5. int tm_mday; /* 一月中的第几天,范围从 1 到 31    */
    6. int tm_mon; /* 月,范围从 0 到 11        */
    7. int tm_year; /* 自 1900 年起的年数        */
    8. int tm_wday; /* 一周中的第几天,范围从 0 到 6    */
    9. int tm_yday; /* 一年中的第几天,范围从 0 到 365    */
    10. int tm_isdst; /* 夏令时                */
    11. };

    库宏

    下面是头文件 time.h 中定义的宏:

    • NULL:这个宏表示空指针常量的值。在 C 语言中,通常使用 NULL 来表示一个空指针,即指向地址为 0 的指针。
    • CLOCKS_PER_SEC:这个宏表示每秒的处理器时钟个数。在 C 语言中,clock() 函数返回的是处理器时钟运行的周期数,通过将其除以 CLOCKS_PER_SEC,就可以得到程序运行的秒数。

    库函数

    下面是头文件 time.h 中定义的函数:

    1. asctime():将结构体 tm 中的时间转换为字符串,并返回一个指向该字符串的指针。
    2. clock():返回程序执行所花费的处理器时钟数,通常用来度量程序的执行时间。
    3. ctime():将从 1970 年 1 月 1 日起经过的秒数转换为当地时间,并返回一个表示当地时间的字符串。
    4. difftime():计算两个时间之间的差异(以秒为单位)。
    5. gmtime():将从 1970 年 1 月 1 日起经过的秒数转换为协调世界时(UTC)或格林威治标准时间(GMT),并返回一个指向表示时间的结构体的指针。
    6. localtime():将从 1970 年 1 月 1 日起经过的秒数转换为本地时间,并返回一个指向表示时间的结构体的指针。
    7. mktime():将一个表示时间的结构体转换为从 1970 年 1 月 1 日起经过的秒数。
    8. strftime():将一个表示时间的结构体按照指定的格式进行格式化,并将结果存储在一个字符串中。
    9. time():获取当前时间,并将其编码成 time_t 格式返回。

    以下是一个示例代码,演示如何使用 time.h 中的函数来处理日期和时间,

    1. #include
    2. #include
    3. int main() {
    4. time_t current_time;
    5. struct tm *time_info;
    6. char time_string[80];
    7. // 获取当前时间
    8. current_time = time(NULL);
    9. // 转换为本地时间
    10. time_info = localtime(¤t_time);
    11. // 格式化时间为字符串
    12. strftime(time_string, sizeof(time_string), "%Y-%m-%d %H:%M:%S", time_info);
    13. // 打印当前时间
    14. printf("当前时间:%s\n", time_string);
    15. return 0;
    16. }

    在这个示例代码中,首先包含了 头文件。然后,在 main() 函数中进行了以下操作:

    1. 声明了一个变量 current_time,用于保存当前时间的时间戳。
    2. 声明了一个指向 struct tm 结构体的指针 time_info,用于保存转换后的本地时间。
    3. 声明了一个字符数组 time_string,用于存储格式化后的时间字符串。
    4. 使用 time(NULL) 函数获取当前时间的时间戳,并将其赋值给 current_time。
    5. 使用 localtime(¤t_time) 函数将时间戳转换为本地时间,并将结果保存在 time_info 中。
    6. 使用 strftime() 函数将本地时间格式化为字符串,并将结果存储在 time_string 中。"%Y-%m-%d %H:%M:%S" 是格式化字符串的格式,用于指定输出的时间格式。
    7. 使用 printf() 函数打印当前时间。

    简介

    C 标准库中的 头文件提供了许多用于处理字符串的函数和宏定义,它们可以帮助开发人员进行字符串操作、内存操作以及一些通用的数组操作。这些函数和宏定义使得在 C 语言中处理字符串和内存操作变得更加便捷和高效。

    库变量

    下面是头文件 string.h 中定义的变量类型:

    序号变量 & 描述
    1size_t
    这是无符号整数类型,它是 sizeof 关键字的结果。

    库宏

    下面是头文件 string.h 中定义的宏:

    序号宏 & 描述
    1

    NULL
    宏NULL在头文件string.h中被定义为一个空指针常量的值。它通常用于表示指针变量没有指向任何有效对象,也可以用于初始化指针变量。在C语言中,宏NULL的定义如下:

    #define NULL ((void *)0)

    这里的(void *)表示一个通用的指针类型,0则表示指针的值为空。因此,当我们将一个指针变量初始化为NULL时,表示该指针不指向任何有效的内存地址。

    需要注意的是,虽然NULL在头文件string.h中定义,但它实际上是C语言标准库中的定义,在其他头文件中同样可以使用。

    库函数

    下面是头文件 string.h 中定义的函数:

    序号函数 & 描述
    1void *memchr(const void *str, int c, size_t n)
    在参数 str 所指向的字符串的前 n 个字节中搜索第一次出现字符 c(一个无符号字符)的位置。
    2int memcmp(const void *str1, const void *str2, size_t n)
    把 str1 和 str2 的前 n 个字节进行比较。
    3void *memcpy(void *dest, const void *src, size_t n)
    从 src 复制 n 个字符到 dest
    4void *memmove(void *dest, const void *src, size_t n)
    另一个用于从 src 复制 n 个字符到 dest 的函数。
    5void *memset(void *str, int c, size_t n)
    复制字符 c(一个无符号字符)到参数 str 所指向的字符串的前 n 个字符。
    6char *strcat(char *dest, const char *src)
    把 src 所指向的字符串追加到 dest 所指向的字符串的结尾。
    7char *strncat(char *dest, const char *src, size_t n)
    把 src 所指向的字符串追加到 dest 所指向的字符串的结尾,直到 n 字符长度为止。
    8char *strchr(const char *str, int c)
    在参数 str 所指向的字符串中搜索第一次出现字符 c(一个无符号字符)的位置。
    9int strcmp(const char *str1, const char *str2)
    把 str1 所指向的字符串和 str2 所指向的字符串进行比较。
    10int strncmp(const char *str1, const char *str2, size_t n)
    把 str1 和 str2 进行比较,最多比较前 n 个字节。
    11int strcoll(const char *str1, const char *str2)
    把 str1 和 str2 进行比较,结果取决于 LC_COLLATE 的位置设置。
    12char *strcpy(char *dest, const char *src)
    把 src 所指向的字符串复制到 dest
    13char *strncpy(char *dest, const char *src, size_t n)
    把 src 所指向的字符串复制到 dest,最多复制 n 个字符。
    14size_t strcspn(const char *str1, const char *str2)
    检索字符串 str1 开头连续有几个字符都不含字符串 str2 中的字符。
    15char *strerror(int errnum)
    从内部数组中搜索错误号 errnum,并返回一个指向错误消息字符串的指针。
    16size_t strlen(const char *str)
    计算字符串 str 的长度,直到空结束字符,但不包括空结束字符。
    17char *strpbrk(const char *str1, const char *str2)
    检索字符串 str1 中第一个匹配字符串 str2 中字符的字符,不包含空结束字符。也就是说,依次检验字符串 str1 中的字符,当被检验字符在字符串 str2 中也包含时,则停止检验,并返回该字符位置。
    18char *strrchr(const char *str, int c)
    在参数 str 所指向的字符串中搜索最后一次出现字符 c(一个无符号字符)的位置。
    19size_t strspn(const char *str1, const char *str2)
    检索字符串 str1 中第一个不在字符串 str2 中出现的字符下标。
    20char *strstr(const char *haystack, const char *needle)
    在字符串 haystack 中查找第一次出现字符串 needle(不包含空结束字符)的位置。
    21char *strtok(char *str, const char *delim)
    分解字符串 str 为一组字符串,delim 为分隔符。
    22size_t strxfrm(char *dest, const char *src, size_t n)
    根据程序当前的区域选项中的 LC_COLLATE 来转换字符串 src 的前 n 个字符,并把它们放置在字符串 dest 中。

    以下是一个简单的示例代码,演示了如何使用 string.h 中的一些函数来进行字符串操作:

    1. #include
    2. #include
    3. int main() {
    4. char str1[20] = "Hello, ";
    5. char str2[20] = "world!";
    6. char str3[20];
    7. int result;
    8. // 使用 strcat 将 str2 追加到 str1 的末尾
    9. strcat(str1, str2);
    10. printf("strcat: %s\n", str1);
    11. // 使用 strncpy 复制 str1 的前 6 个字符到 str3 中
    12. strncpy(str3, str1, 6);
    13. str3[6] = '\0'; // 需要手动添加字符串结束符
    14. printf("strncpy: %s\n", str3);
    15. // 使用 strlen 获取字符串长度
    16. printf("strlen: %lu\n", strlen(str1));
    17. // 使用 strcmp 比较 str1 和 str2 是否相等
    18. result = strcmp(str1, str2);
    19. if (result == 0) {
    20. printf("strcmp: str1 等于 str2\n");
    21. } else {
    22. printf("strcmp: str1 不等于 str2\n");
    23. }
    24. // 使用 memset 将 str3 的前 5 个字符设置为 'A'
    25. memset(str3, 'A', 5);
    26. printf("memset: %s\n", str3);
    27. // 使用 memcpy 将 str2 的前 5 个字符复制到 str3 中
    28. memcpy(str3, str2, 5);
    29. str3[5] = '\0'; // 需要手动添加字符串结束符
    30. printf("memcpy: %s\n", str3);
    31. // 使用 strchr 在 str1 中查找字符 'o'
    32. char* ptr = strchr(str1, 'o');
    33. printf("strchr: %s\n", ptr);
    34. // 使用 strstr 在 str1 中查找字符串 "world"
    35. ptr = strstr(str1, "world");
    36. printf("strstr: %s\n", ptr);
    37. // 使用 strtok 分割字符串
    38. char str4[] = "hello,world,how,are,you";
    39. char* token = strtok(str4, ",");
    40. while (token != NULL) {
    41. printf("strtok: %s\n", token);
    42. token = strtok(NULL, ",");
    43. }
    44. return 0;
    45. }

    让我们编译并运行上面的程序,这将产生以下结果:

    1. strcat: Hello, world!
    2. strncpy: Hello,
    3. strlen: 13
    4. strcmp: str1 不等于 str2
    5. memset: AAAAA,
    6. memcpy: world
    7. strchr: o, world!
    8. strstr: world!
    9. strtok: hello
    10. strtok: world
    11. strtok: how
    12. strtok: are
    13. strtok: you
  • 相关阅读:
    web分析-手把手教你怎么写小程序事件分析
    git命令
    遍历链。遍历链。
    CondaError: Downloaded bytes did not match Content-Length
    前端经典面试题 | 闭包的作用和原理
    【Leetcode】236. 二叉树的最近公共祖先
    记一次应急响应之ssh日志和apache2日志分析
    2024最新VMware Workstation Pro下载教程
    bootstrap-datepicker控件的使用及修改位置错误问题
    flink sql clinet 实战:窗口函数----flink-1.13.6
  • 原文地址:https://blog.csdn.net/m0_74293254/article/details/134540369