C 语言标准库(二)

person c猿人    watch_later 2024-09-21 21:27:42
visibility 234    class stddef,errno,float,limits    bookmark 专栏

除了之前介绍的几个常用标准库外,C 语言标准库还包含很多其他有用的库,涵盖文件处理、信号处理、断言调试、可变参数列表等方面。以下是一些常用的标准库及其重要函数:


1. <ctype.h> —— 字符分类与转换

<ctype.h> 提供了一组函数,用于判断和转换字符类型,常用于处理单个字符的判断,如是否为字母、数字或特殊字符。

1.1 字符判断函数

  • int isalpha(int c):判断字符是否为字母。
  • int isdigit(int c):判断字符是否为数字。
  • int isalnum(int c):判断字符是否为字母或数字。
  • int islower(int c):判断字符是否为小写字母。
  • int isupper(int c):判断字符是否为大写字母。
  • int isspace(int c):判断字符是否为空白字符(如空格、换行、制表符等)。
  • int ispunct(int c):判断字符是否为标点符号。

1.2 字符转换函数

  • int tolower(int c):将字符转换为小写字母。
  • int toupper(int c):将字符转换为大写字母。

示例:判断和转换字符

#include <stdio.h>
#include <ctype.h>

int main() {
    char c = 'A';

    if (isalpha(c)) {
        printf("%c 是一个字母\n", c);
    }

    char lower = tolower(c);
    printf("%c 转换为小写: %c\n", c, lower);

    return 0;
}

2. <assert.h> —— 断言库

<assert.h> 提供了断言函数 assert,用于在程序中做条件判断,在条件不满足时终止程序并打印错误信息,常用于调试。

  • void assert(int expression):如果表达式的值为 0(假),则程序终止,并输出错误信息。

示例:断言调试

#include <stdio.h>
#include <assert.h>

int main() {
    int x = 10;
    assert(x == 10); // 正确,不触发断言

    x = 5;
    assert(x == 10); // 错误,程序会中断

    return 0;
}

3. <stdarg.h> —— 可变参数列表

<stdarg.h> 提供了处理可变参数函数的宏,例如可以编写接受不定数量参数的函数(如 printf 函数)。

3.1 常用宏

  • va_list:声明一个变量,用于存储参数信息。
  • va_start(va_list ap, last):初始化 ap,使其指向第一个可变参数。
  • va_arg(va_list ap, type):返回当前可变参数的值,并将 ap 指向下一个参数。
  • va_end(va_list ap):清理 ap

示例:实现类似 printf 的可变参数函数

#include <stdio.h>
#include <stdarg.h>

void print_numbers(int count, ...) {
    va_list args;
    va_start(args, count); // 初始化参数列表

    for (int i = 0; i < count; i++) {
        int num = va_arg(args, int); // 获取参数
        printf("%d ", num);
    }

    va_end(args); // 清理参数列表
    printf("\n");
}

int main() {
    print_numbers(3, 10, 20, 30); // 输出: 10 20 30
    return 0;
}

4. <signal.h> —— 信号处理库

<signal.h> 提供了用于处理信号(如终止程序的信号、异常信号等)的函数。信号是操作系统与程序之间的通信机制,程序可以通过捕获信号并进行相应处理来避免突然终止。

4.1 常用函数

  • void (*signal(int signum, void (*handler)(int)))(int):指定一个信号处理函数,signum 表示信号编号,handler 是处理该信号的函数。
  • int raise(int sig):向自身发送信号。

4.2 常见信号

  • SIGINT:程序中断(通常由 Ctrl + C 触发)。
  • SIGTERM:程序终止信号。
  • SIGFPE:算术错误信号(如除零)。
  • SIGSEGV:无效内存访问(段错误)。

示例:捕获 SIGINT 信号

#include <stdio.h>
#include <signal.h>
#include <stdlib.h>

void handle_sigint(int sig) {
    printf("捕获到 SIGINT 信号\n");
    exit(0); // 退出程序
}

int main() {
    signal(SIGINT, handle_sigint); // 设置信号处理函数

    while (1) {
        printf("程序运行中...\n");
        sleep(1);
    }

    return 0;
}

5. <limits.h><float.h> —— 类型范围和精度

5.1 <limits.h> —— 整数类型的取值范围

<limits.h> 定义了各种整型变量的取值范围。例如:

  • INT_MAXint 类型的最大值。
  • INT_MINint 类型的最小值。
  • UINT_MAXunsigned int 类型的最大值。

示例:输出整型的取值范围

#include <stdio.h>
#include <limits.h>

int main() {
    printf("int 的最大值: %d\n", INT_MAX);
    printf("int 的最小值: %d\n", INT_MIN);
    printf("unsigned int 的最大值: %u\n", UINT_MAX);
    return 0;
}

5.2 <float.h> —— 浮点类型的取值范围和精度

<float.h> 定义了浮点类型的取值范围和精度。例如:

  • FLT_MAXfloat 类型的最大值。
  • DBL_MAXdouble 类型的最大值。
  • LDBL_MAXlong double 类型的最大值。

示例:输出浮点型的取值范围

#include <stdio.h>
#include <float.h>

int main() {
    printf("float 的最大值: %e\n", FLT_MAX);
    printf("double 的最大值: %e\n", DBL_MAX);
    return 0;
}

6. <errno.h> —— 错误处理

<errno.h> 提供了系统错误码,通过全局变量 errno 来表示最近发生的错误。

  • int errno:表示最近一次系统调用或库函数失败的错误码。
  • char *strerror(int errnum):返回与错误码 errnum 对应的错误消息。
  • void perror(const char *s):打印错误消息。

示例:错误处理

#include <stdio.h>
#include <errno.h>
#include <string.h>

int main() {
    FILE *file = fopen("nonexistent.txt", "r");

    if (file == NULL) {
        perror("文件打开失败"); // 打印错误信息
        printf("错误代码: %d\n", errno);
        printf("错误信息: %s\n", strerror(errno));
    }

    return 0;
}

7. <stddef.h> —— 标准定义

<stddef.h> 定义了一些常用的类型和宏,如 size_tptrdiff_tNULL 等。

  • size_t:用于表示对象的大小,通常由 sizeof 操作符返回。
  • ptrdiff_t:用于表示指针之间的差值。
  • NULL:空指针的宏定义。

示例:使用 size_tNULL

#include <stdio.h>
#include <stddef.h>

int main() {
    int arr[] = {1, 2, 3, 4};
    size_t n = sizeof(arr) / sizeof(arr[0]);
    printf("数组的长度: %zu\n", n);

    int *p = NULL; // 定义空指针
    if (p == NULL) {
        printf("指针为空\n");
    }

    return 0;
}

这些库函数和宏大大增强了 C 语言的功能,能够简化编程工作并提供高效的解决方案。根据需求,熟练使用这些标准库函数可以帮助开发者快速实现各种功能。

评论区
评论列表
menu