简介

  • C语言常用函数

open

open() 函数是C语言标准库中的一个函数,用于打开文件或创建新文件。它是在文件操作中非常常用的一个函数,可以用来读取、写入和创建文件。

以下是关于open()函数的详细解释:

1
2
3
4
#include <fcntl.h>

int open(const char *pathname, int flags);
int open(const char *pathname, int flags, mode_t mode);
  • pathname:表示文件路径的字符串,可以是相对路径或绝对路径。
  • flags:表示打开文件的标志,可以是以下之一或多个标志的组合:
    • O_RDONLY:以只读方式打开文件。
    • O_WRONLY:以只写方式打开文件。
    • O_RDWR:以读写方式打开文件。
    • O_CREAT:如果文件不存在则创建文件。
    • O_TRUNC:如果文件存在,截断文件长度为0。
    • O_APPEND:在文件末尾追加数据。
  • mode:仅在使用O_CREAT标志时生效,表示新创建文件的权限。

open()函数返回一个非负整数的文件描述符(file descriptor),用于后续的文件操作。如果出现错误,它返回-1。

以下是一个简单的示例,演示如何使用open()函数打开或创建文件:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
#include <stdio.h>
#include <fcntl.h>
#include <unistd.h>

int main() {
    const char *filename = "example.txt";

    // 使用 open() 函数创建或打开文件
    int fd = open(filename, O_RDWR | O_CREAT, 0666);

    if (fd == -1) {
        perror("Error opening file");
        return 1;
    }

    // 使用文件描述符进行读写操作
    char buffer[256];
    ssize_t bytesRead = read(fd, buffer, sizeof(buffer));
    ssize_t bytesWritten = write(fd, "Hello, World!", 13);

    if (bytesRead == -1 || bytesWritten == -1) {
        perror("Error reading/writing file");
        close(fd);
        return 1;
    }

    // 关闭文件描述符
    close(fd);

    return 0;
}

在示例中,我们首先使用open()函数打开或创建一个名为 “example.txt” 的文件,并获取文件描述符。然后,我们使用文件描述符进行读写操作,最后使用close()函数关闭文件描述符。

请注意,open()函数的具体参数和标志可以根据你的需求进行调整,以便执行不同的文件操作。另外,为了防止资源泄漏,务必在不再需要使用文件描述符时使用close()函数关闭文件。

ceil

在 C 语言中,ceil() 是一个数学函数,用于向上取整(上取整数)。这意味着它会将一个浮点数值调整到不小于它的最小整数。ceil() 函数位于 math.h 头文件中。

函数原型如下:

1
double ceil(double x);

参数 x 是一个浮点数,函数返回大于或等于 x 的最小整数值。返回值是一个双精度浮点数。

下面是一个示例代码,演示了如何使用 ceil() 函数:

1
2
3
4
5
6
7
8
9
10
11
12
#include <stdio.h>
#include <math.h>

int main() {
    double num = 12.34;
    double result = ceil(num);

    printf("Original Number: %.2f\n", num);
    printf("Ceil Value: %.2f\n", result);

    return 0;
}

在这个示例中,ceil(12.34) 的返回值是 13.00,因为它是不小于 12.34 的最小整数。

ceil() 函数在很多数学计算和处理场景中非常有用,特别是在需要确保向上取整的情况下,比如计算资源分配、涉及货币的计算等。

fnmatch

fnmatch() 函数是C标准库中用于进行模式匹配的函数之一,它可以用来比较一个字符串是否匹配指定的模式。这个函数通常用于文件名匹配等场景。以下是关于 fnmatch() 函数的详细解释:

函数原型:

1
2
3
#include <fnmatch.h>

int fnmatch(const char *pattern, const char *string, int flags);

参数:

  • pattern:要匹配的模式字符串。
  • string:要进行匹配的输入字符串。
  • flags:控制匹配行为的标志位,可以是以下之一或它们的组合:
    • FNM_NOESCAPE:不解释反斜杠 \ 作为转义字符。
    • FNM_PATHNAME:模式中的斜杠只与斜杠匹配。
    • FNM_PERIOD:模式中的起始点 . 只与起始点匹配。
    • FNM_FILE_NAME:等效于 FNM_PATHNAME | FNM_PERIOD

返回值:

  • 如果匹配成功,返回0。
  • 如果不匹配,返回 FNM_NOMATCH
  • 如果发生错误,返回其他非零值。

示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include <fnmatch.h>
#include <stdio.h>

int main() {
    const char *pattern = "*.txt";
    const char *strings[] = {"file.txt", "example.txt", "document.doc"};

    for (size_t i = 0; i < sizeof(strings) / sizeof(strings[0]); ++i) {
        if (fnmatch(pattern, strings[i], 0) == 0) {
            printf("%s matches the pattern.\n", strings[i]);
        } else {
            printf("%s does not match the pattern.\n", strings[i]);
        }
    }

    return 0;
}

在上面的示例中,fnmatch() 函数被用来检查字符串数组中的每个元素是否匹配指定的模式。pattern 参数是要匹配的模式,string 参数是要进行匹配的字符串。函数返回0表示匹配成功,FNM_NOMATCH 表示不匹配。

需要注意的是,fnmatch() 函数可能会依赖于实现和操作系统的特定行为。在使用时,务必查阅操作系统和标准库的文档来了解更多细节和支持情况。

inet_ntoa

在 C 语言中,inet_ntoa() 函数用于将网络字节序(大端字节序)的IPv4地址转换为点分十进制形式的字符串表示。它的详细说明如下:

函数原型:

1
2
3
#include <arpa/inet.h>

char *inet_ntoa(struct in_addr in);

参数:

  • in: 一个struct in_addr结构体,包含要转换的IPv4地址。

返回值:

  • 如果转换成功,函数返回一个指向包含点分十进制IPv4地址的静态缓冲区的指针。
  • 如果转换失败,函数返回NULL,并设置errno

注意事项:

  • inet_ntoa()函数是不可重入的(not thread-safe)。它使用了一个静态缓冲区来存储转换后的字符串。因此,如果在同一线程中多次调用inet_ntoa(),它会覆盖前一次的结果。

示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include <stdio.h>
#include <arpa/inet.h>

int main() {
    struct in_addr addr;
    inet_pton(AF_INET, "192.168.1.100", &addr);

    char *ip_str = inet_ntoa(addr);
    if (ip_str == NULL) {
        perror("inet_ntoa");
        return 1;
    }

    printf("IPv4 Address: %s\n", ip_str);
    return 0;
}

在上面的示例中,我们首先使用inet_pton()函数将字符串形式的IPv4地址转换为struct in_addr结构体(网络字节序)。然后,我们使用inet_ntoa()函数将该结构体转换为点分十进制形式的字符串,并打印出来。

需要注意的是,由于inet_ntoa()使用静态缓冲区,如果需要在同一线程中多次使用它或保留转换后的字符串内容,最好将其复制到自己管理的内存中,以避免数据覆盖问题。

sscanf()

sscanf() 函数是 C 语言标准库 <stdio.h> 中的一个函数,用于从字符串中按照格式化字符串提取数据,类似于 scanf() 函数。它的作用是从一个字符串中解析数据,将解析的结果按照指定格式存储到给定的变量中。

函数原型如下:

1
int sscanf(const char *str, const char *format, ...);
  • str 是一个指向要解析的输入字符串的指针。
  • format 是一个格式字符串,规定了解析 str 中数据的方式。
  • 可变参数表示要将解析出的数据存储的位置。

sscanf() 会尝试按照指定的格式从输入字符串 str 中读取数据,并根据格式字符串 format 的定义将数据转换为相应类型。它会跳过空白字符(空格、制表符等),然后根据 format 字符串的指示进行解析。

以下是一个示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include <stdio.h>

int main() {
    const char *input_string = "Age: 30, Height: 175.5, Weight: 70.2";

    int age;
    float height, weight;

    // 使用 sscanf() 从字符串中提取数据
    sscanf(input_string, "Age: %d, Height: %f, Weight: %f", &age, &height, &weight);

    printf("Age: %d\n", age);
    printf("Height: %.1f\n", height);
    printf("Weight: %.1f\n", weight);

    return 0;
}

在上述示例中,sscanf() 函数从字符串 input_string 中读取数据。"Age: %d, Height: %f, Weight: %f" 指示了解析字符串的格式,分别提取整数、浮点数和浮点数,并将它们存储在 ageheightweight 变量中。

需要注意的是,sscanf() 在解析字符串时,要确保格式字符串与输入字符串的格式相匹配,否则可能会导致意外的行为或错误的解析结果。此外,也要注意输入数据的有效性和边界情况,以防止缓冲区溢出等问题。