C语言函数大全-- o 开头的函数

news2024/11/17 16:37:57

C语言函数大全

本篇介绍C语言函数大全-- o 开头的函数

1. obstack_init,obstack_free,obstack_alloc,obstack_blank,obstack_grow

1.1 函数说明

函数声明函数功能
void obstack_init(struct obstack *obstack_ptr);它是 POSIX 标准库中的一个非标准函数,用于初始化对象堆栈。对象堆栈是一种可以动态增长以存储任意类型的对象的数据结构。其中,obstack_ptr 参数是一个指向 struct obstack 类型的指针,表示要初始化的对象堆栈。
void obstack_free(struct obstack *obstack_ptr, void *object_ptr);用于释放通过对象堆栈分配的所有内存。其中,obstack_ptr 参数是一个指向 struct obstack 类型的指针,表示要释放的对象堆栈;object_ptr 参数是要释放的内存块。
void *obstack_alloc(struct obstack *obstack_ptr, int size);用于从对象堆栈中分配指定大小的内存,并返回其地址。其中,obstack_ptr 参数是一个指向 struct obstack 类型的指针,表示要从中分配内存的对象堆栈;size 参数表示要分配的内存块的大小。
void *obstack_blank(struct obstack *obstack_ptr, int size);用于向对象堆栈添加指定数量的空间,并返回指向添加的第一个字节的指针。其中,obstack_ptr 参数是一个指向 struct obstack 类型的指针,表示要添加空间的对象堆栈;size 参数表示要添加的空间大小。
void *obstack_grow(struct obstack *obstack_ptr, const void *data, int size);用于将数据复制到对象堆栈,并返回指向添加的第一个字节的指针。其中,obstack_ptr 参数是一个指向 struct obstack 类型的指针,表示要添加数据的对象堆栈;data 参数是要复制的数据的指针;size 参数表示要复制的数据的大小。

1.2 演示示例

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <obstack.h>

int main(void)
{
    struct obstack my_obstack;
    const char *str1 = "Hello, ";
    const char *str2 = "World!";
    char *dst;

    obstack_init(&my_obstack);

    dst = (char *)obstack_alloc(&my_obstack, strlen(str1) + strlen(str2) + 1);
    strcpy(dst, str1);
    strcat(dst, str2);

    printf("%s\n", (char *)my_obstack.chunk);

    dst = (char *)obstack_blank(&my_obstack, sizeof(int)*2);
    int a = 100;
    int b = 200;
    memcpy(dst, &a, sizeof(int));
    memcpy(dst+sizeof(int), &b, sizeof(int));

    printf("%d %d\n", *(int *)(my_obstack.next_free-sizeof(int)*2), *(int *)(my_obstack.next_free-sizeof(int)));

    double d = 3.1415926;
    dst = (char *)obstack_grow(&my_obstack, &d, sizeof(double));

    printf("%f\n", *(double *)(my_obstack.next_free-sizeof(double)));

    obstack_free(&my_obstack, NULL);

    return 0;
}

在上述的程序中,

  • 我们首先定义一个名为 my_obstackstruct obstack 类型变量,并将其传递给 obstack_init() 函数以初始化对象堆栈。
  • 接着,我们使用 obstack_alloc() 函数从对象堆栈中分配一块内存,并将两个字符串连接起来。
  • 然后,我们使用 obstack_blank() 函数向对象堆栈添加一块指定大小的空间,并使用 memcpy() 函数将两个整数复制到该空间中。
  • 接下来,我们使用 obstack_grow() 函数向对象堆栈添加一个双精度浮点数,并返回指向该浮点数的指针。
  • 最后,我们使用 printf() 函数将连接后的字符串、添加的整数和添加的双精度浮点数输出到终端,并使用 obstack_free() 函数释放通过对象堆栈分配的所有内存。

注意:在使用 obstack_blank() 函数向对象堆栈添加空间时,建议使用 sizeof 运算符来计算要添加的空间大小,并在使用 memcpy() 复制数据时也应该小心不要越界。同时,在使用 obstack_grow() 函数向对象堆栈添加数据时,需要小心指针是否正确,并且操作前需要先使用 memcpy() 将要添加的数据复制到一个临时变量中。

2. offsetof

2.1 宏说明

宏定义宏描述
#define offsetof(type, member) ((size_t)(&((type *)0)->member))它是一个宏,用于获取结构体中某个成员的偏移量。

参数:

  • type : 表示结构体类型
  • member : 表示结构体中的一个成员变量名

返回值: 一个 size_t 类型的值,表示该成员变量在结构体中的偏移量(单位是字节)。

2.2 演示示例

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

struct example {
    int a;
    char b;
    double c;
};

int main(void)
{
    size_t offset_b = offsetof(struct example, b);
    printf("Offset of 'b' in struct example: %zu\n", offset_b);

    return 0;
}

在这个程序中,

  • 我们定义了一个名为 example 的结构体类型,并使用 offsetof 宏获取结构体中成员变量 b 的偏移量。
  • 最后,我们使用 printf() 函数将结果输出到终端。

注意: 在使用 offsetof 宏时,结构体类型名称必须使用括号括起来,否则代码会产生语法错误。此外,offsetof 宏的参数必须是已定义的结构体类型名称和该结构体类型中的成员变量名称,否则也会导致编译错误。

3. open

3.1 函数说明

函数声明函数功能
int open(const char *path, int oflag, ...);用于打开文件

参数:

  • path : 表示要打开的文件路径
  • oflag : 表示打开文件时的选项标志,可以为以下常量之一或多个按位或组合而成:
    • O_RDONLY:只读模式打开文件。
    • O_WRONLY:只写模式打开文件。
    • O_RDWR:读写模式打开文件。
    • O_CREAT:如果文件不存在,则创建它。
    • O_TRUNC:如果文件已存在,则将其长度截断为 0。
    • O_APPEND:在文件末尾追加数据。
  • 可选参数 : 表示文件所有者、组和其他用户的访问权限。如果使用了 O_CREAT 选项,则必须提供这个参数

3.2 演示示例

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <fcntl.h>

int main(void)
{
    int fd = open("temp.txt", O_RDONLY);
    if (fd == -1) {
        perror("open");
        exit(1);
    }

    char buf[1024];
    ssize_t nread;
    while ((nread = read(fd, buf, sizeof(buf))) > 0) {
        if (write(STDOUT_FILENO, buf, nread) != nread) {
            perror("write");
            exit(1);
        }
    }

    if (nread == -1) {
        perror("read");
        exit(1);
    }

    if (close(fd) == -1) {
        perror("close");
        exit(1);
    }

    return 0;
}

在上述的程序中,

  • 我们使用 open() 函数打开文件 temp.txt,并通过 read() 函数读取其中的数据。
  • 然后,我们使用 write() 函数将数据写入标准输出,直到读取完整个文件。
  • 最后,我们使用 close() 函数关闭文件。

注意: 在使用 open() 函数打开文件时,返回值为负数则表示出现了错误。此时可以使用 perror() 函数输出错误信息,并使用 exit() 函数退出程序。同时,在使用 read() 函数和 write() 函数读写文件时也需要小心处理返回值,以避免出现不可预期的错误。

3.3 运行结果

在这里插入图片描述

在这里插入图片描述

4. openat

4.1 函数说明

函数声明函数功能
int openat(int dirfd, const char *pathname, int flags, mode_t mode);它是 Linux 系统定义的一个函数,它可以打开一个相对于指定目录的文件。与 open() 函数相比,openat() 函数更加灵活,并支持更多的选项。

参数:

  • dirfd : 表示要打开文件所在目录的文件描述符。如果传递的是 AT_FDCWD,则表示使用当前工作目录。
  • pathname : 表示要打开的文件路径
  • flags : 表示打开文件时的选项标志,可以为以下常量之一或多个按位或组合而成:
    • O_RDONLY:只读模式打开文件。
    • O_WRONLY:只写模式打开文件。
    • O_RDWR:读写模式打开文件。
    • O_CREAT:如果文件不存在,则创建它。
    • O_TRUNC:如果文件已存在,则将其长度截断为 0。
    • O_APPEND:在文件末尾追加数据。
    • O_DIRECTORY:要求打开的文件必须是一个目录。
    • O_NOFOLLOW:不跟随符号链接打开文件。
  • mode : 表示文件所有者、组和其他用户的访问权限。如果使用了 O_CREAT 选项,则必须提供这个参数

4.2 演示示例

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <fcntl.h>
#include <dirent.h>

int main(void)
{
    int dirfd = open(".", O_RDONLY | O_DIRECTORY);
    if (dirfd == -1) {
        perror("open");
        exit(1);
    }

    DIR *dirp = fdopendir(dirfd);
    if (dirp == NULL) {
        perror("fdopendir");
        exit(1);
    }

    struct dirent *entry;
    while ((entry = readdir(dirp)) != NULL) {
        printf("%s\n", entry->d_name);
    }

    if (closedir(dirp) == -1) {
        perror("closedir");
        exit(1);
    }

    return 0;
}

在这个程序中,

  • 我们使用 openat() 函数打开当前目录,并通过 fdopendir() 函数将文件描述符转换为目录流。
  • 然后,我们使用 readdir() 函数读取目录中的文件,并将文件名输出到终端。
  • 最后,我们使用 closedir() 函数关闭目录。

注意: 在使用 openat() 函数打开文件时,可以通过传递不同的文件描述符指定要打开的目录,从而实现更加灵活的操作。此外,在使用 readdir() 函数读取目录时也需要注意判断返回值是否为 NULL,以避免出现不可预期的错误。

5. opendir

5.1 函数说明

函数声明函数功能
DIR *opendir(const char *name);它是 POSIX 标准定义的一个函数,用于打开目录并返回一个指向 DIR 结构体类型的指针。

参数:

  • name : 表示要打开的目录路径

返回值:

  • 如果该函数执行成功,则返回一个指向 DIR 类型的指针;
  • 否则返回 NULL

5.2 演示示例

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

int main(void)
{
    DIR *dirp = opendir(".");
    if (dirp == NULL) {
        perror("opendir");
        exit(1);
    }

    struct dirent *entry;
    while ((entry = readdir(dirp)) != NULL) {
        printf("%s\n", entry->d_name);
    }

    if (closedir(dirp) == -1) {
        perror("closedir");
        exit(1);
    }

    return 0;
}

在上述的程序中,我们使用 opendir() 函数打开当前目录,并通过 readdir() 函数读取目录中的文件名,最后使用 closedir() 函数关闭目录。

注意: 在使用 opendir() 函数打开目录时,返回值为 NULL 则表示出现了错误。此时可以使用 perror() 函数输出错误信息,并使用 exit() 函数退出程序。同时,在使用 readdir() 函数读取目录时也需要小心处理返回值,以避免出现不可预期的错误。

6. openpty

6.1 函数说明

函数声明函数功能
int openpty(int *amaster, int *aslave, char *name, const struct termios *termp, const struct winsize *winp);它是 POSIX 标准定义的一个函数,用于打开一个伪终端(PTY)并返回与之关联的主从设备文件描述符。伪终端可以用于在进程之间建立通信,或者在程序中模拟终端行为。

参数:

  • amaster : 表示要返回的主设备文件描述符
  • aslave : 表示要返回的从设备文件描述符
  • name : 表示从设备名称的缓冲区,如果不需要则可以传递 NULL
  • termp : 表示要使用的终端属性,如果不需要则可以传递 NULL
  • winp : 表示要使用的窗口大小,如果不需要则可以传递 NULL

返回值:

  • 如果该函数执行成功,则返回值为 0
  • 否则返回 -1

6.2 演示示例

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <fcntl.h>
#include <termios.h>

int main(void)
{
    int master, slave;
    char buf[1024];
    ssize_t nread;

    if (openpty(&master, &slave, NULL, NULL, NULL) == -1) {
        perror("openpty");
        exit(1);
    }

    printf("Slave device: /dev/pts/%d\n", slave);

    while ((nread = read(STDIN_FILENO, buf, sizeof(buf))) > 0) {
        if (write(master, buf, nread) != nread) {
            perror("write");
            exit(1);
        }
    }

    if (nread == -1) {
        perror("read");
        exit(1);
    }

    if (close(master) == -1) {
        perror("close");
        exit(1);
    }

    return 0;
}

在上述的程序中,

  • 我们使用 openpty() 函数打开一个伪终端,并通过 read() 函数读取标准输入中的数据。
  • 然后,我们将数据写入主设备文件描述符;
  • 最后关闭该设备。

注意: 在使用 openpty() 函数打开伪终端时,返回值为 -1 则表示出现了错误。此时可以使用 perror() 函数输出错误信息,并使用 exit() 函数退出程序。同时,在使用 read() 函数和 write() 函数读写文件时也需要小心处理返回值,以避免出现不可预期的错误。

7. on_exit

7.1 函数说明

函数声明函数功能
int on_exit(void (*function)(int, void *), void *arg);它是 POSIX 标准定义的一个函数,用于在进程退出时调用注册的回调函数。这个函数可以用于在程序异常退出或者正常退出时执行一些清理工作、记录日志等操作

参数:

  • function : 表示要注册的回调函数
  • arg : 表示传递给回调函数的参数

返回值:

  • 如果该函数执行成功,则返回值为 0
  • 否则返回 -1

7.2 演示示例

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

void cleanup(int status, void *arg)
{
    printf("Cleanup function called with status %d\n", status);
}

int main(void)
{
    if (on_exit(cleanup, NULL) != 0) {
        perror("on_exit");
        exit(EXIT_FAILURE);
    }

    printf("This is the main program\n");

    return 0;
}

在如上的程序中,

  • 我们使用 on_exit() 函数注册了一个回调函数 cleanup(),并将其参数设置为 NULL。
  • 然后,在主函数中输出了一条消息。当程序退出时,会自动调用回调函数来进行清理操作。

8. outtext

8.1 函数说明

函数声明函数功能
void outtext(char *textstring);在图形视区显示一个字符串

8.2 演示示例

#include <graphics.h>

int main(void)
{
   int gdriver = DETECT, gmode, errorcode;
   int midx, midy;

   initgraph(&gdriver, &gmode, "");

   midx = getmaxx() / 2;
   midy = getmaxy() / 2;

   moveto(midx, midy);

   outtext("This ");
   outtext("is ");
   outtext("a ");
   outtext("test.");

   getch();
   closegraph();
   return 0;
}

在上述的程序中,

  • 我们首先调用 initgraph() 函数初始化图形系统;
  • 然后获取窗口的中心坐标;
  • 接着使用 moveto() 函数将当前绘图位置移动到屏幕中心。
  • 最后,使用 outtext() 函数输出一段文字,然后等待用户按下任意键,并关闭图形窗口。

8.3 运行结果

在这里插入图片描述

9. outtextxy

9.1 函数说明

函数声明函数功能
void outtextxy(int x, int y, char *textstring);在指定位置显示一字符串

参数:

9.2 演示示例

#include <graphics.h>

int main(void)
{
   int gdriver = DETECT, gmode, errorcode;
   int x, y;

   initgraph(&gdriver, &gmode, "");

   x = getmaxx() / 2;
   y = getmaxy() / 2;

   outtextxy(x, y, "Hello, world!");

   getch();
   closegraph();
   return 0;
}

在上述这个程序中,

  • 我们首先通过 initgraph() 函数初始化图形系统并创建一个窗口;
  • 然后,定义了一个坐标位置 (x, y) 并使用 outtextxy() 函数在该位置输出一段文本。
  • 最后,使用 getch 函数等待用户按下任意键,然后关闭图形窗口。

9.3 运行结果

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/455638.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Python采集某网站小sp内容, m3u8内容下载

前言 嗨喽~大家好呀&#xff0c;这里是魔王呐 ❤ ~! 环境使用: Python 3.8 Pycharm 模块使用: import requests >>> pip install requests import re 正则表达式 解析数据 import json 本次案例所用知识点: python基础语法: 字典创建/取值 print输出函数使用…

【人工智能概论】 RNN、LSTM、GRU简单入门与应用举例、代码耗时计算

【人工智能概论】 RNN、LSTM、GRU简单入门与应用举例、代码耗时计算 文章目录 【人工智能概论】 RNN、LSTM、GRU简单入门与应用举例、代码耗时计算一. RNN简介1.1 概念简介1.2 方法使用简介 二. 编码层embedding2.1 embedding的参数2.2 embedding的理解 三. Linear层与CrossEnt…

全景图像算法简述

全景图像拼接是一种将多个图像合成为一个大型全景图像的技术。这种技术广泛应用于虚拟现实、游戏开发、文化遗产保护等领域。本文将介绍三种主流的全景图像拼接算法&#xff0c;并对它们进行综合比较。 一、基于特征点匹配的拼接算法 特征点匹配是全景图像拼接中最常用的一种算…

深入讲解ARMv8 异常处理简介

内核稳定性问题复杂多样&#xff0c;最常见的莫过于“kernel panic”&#xff0c;意为“内核恐慌&#xff0c;不知所措”。这种情况下系统自然无法正常运转&#xff0c;只能自我结束生命&#xff0c;留下死亡信息。诸如&#xff1a; “Unable to handle kernel XXX at virtual …

直播系统开发中哪些技术架构是必不可少的

在当今数字化时代&#xff0c;直播已成为一种极其受欢迎的娱乐和营销方式。由于直播应用的复杂性&#xff0c;架构师在直播系统的开发和设计中扮演着至关重要的角色。本文将介绍直播系统开发中技术架构师所必不可少的技术和工具。 什么是直播系统&#xff1f; 直播系统是一种通…

uni-app入门到实战

&#x1f37f;*★,*:.☆(&#xffe3;▽&#xffe3;)/$:*.★* &#x1f37f; &#x1f35f;欢迎来到前端初见的博文&#xff0c;本文主要讲解uni-app入门到实战&#x1f35f; &#x1f468;‍&#x1f527; 个人主页 : 前端初见 &#x1f95e;喜欢的朋友可以关注一下&#xff…

【Linux】浏览器写代码!部署code-server远程vscode网页

部署code-server远程vscode网页&#xff0c;在浏览器上写代码&#xff01; 参考文档 https://developer.aliyun.com/article/876967#slide-7 本文首发于 慕雪的寒舍 1.什么是code-server&#xff1f; 注意&#xff0c;这不是在linux系统上安装vscode软件&#xff08;和windo…

虹科分享 | 如何主动保护个人信息 | 网络安全评级

网上报税和支付越来越流行&#xff0c;针对毫无防备的纳税人的税务欺诈也越来越频繁。以下是一些需要避免的常见网上税务骗局&#xff1a; 网络钓鱼诈骗 骗子利用电子邮件、短信或电话伪装成相关机构或报税软件提供商&#xff0c;诱骗人们提供他们的个人信息&#xff0c;或点击…

走进梦龙冰淇淋的生产线 揭晓“灯塔工厂”背后的秘密

作为一家积极履行社会责任的公司&#xff0c;联合利华和路雪在今年3月携手京东“青绿计划”&#xff0c;推出了包含梦龙、可爱多、千层雪、和路雪等多款可持续组合装产品&#xff0c;这一助力实现双碳目标的举措也引发了消费者的关注。其实&#xff0c;自联合利华太仓食品生产基…

我们都被 ChatGPT 给骗了?

引言&#xff1a; 用过 ChatGPT 的人都知道&#xff0c;当你与 chatgpt 对话的时候&#xff0c;它是“逐字输出”的&#xff0c;就像真的有个人在跟你打字一样。其实&#xff0c;这种技术并没有那么神奇&#xff0c;这种技术叫做“实时文本生成”或“逐字输出”技术&#xff0…

分布式事务Seata-AT模式

承接上文分布式事务-二阶段提交 Seata是开源的分布式事务解决方案&#xff0c;提供高性能和简单易用的分布式事务服务&#xff0c;包含AT、TCC、 SAGA、XA四种事务模式&#xff0c;为用户打造一站式的分布式解决方案。 Seata提供的4种事务模式都是由2PC&#xff08;二阶段提交…

【C++的内联函数】

文章目录 一、什么是内联函数二、内联函数的优缺点三、使用内联函数的注意事项 一、什么是内联函数 用关键字inline修饰的函数叫做内联函数。 C编译器编译时会自动在被调用的地方展开。 二、内联函数的优缺点 内联函数的优点&#xff1a; 没有函数栈帧创建&#xff0c;提升…

干货分享 | 如何在业余时间学习数据分析?

从社会学背景的数分小白到独揽公司市场部的数据分析&#xff0c;和大家简单分享我的数据分析升级打怪之路。 简单说就是两点【培养数据分析思维】【提升数据分析技能】 思维的培养主要靠书籍和课程 以下是一些对我影响较大的书籍&#xff0c;按照【入门、进阶、高阶】简单做了…

torch.nn.Multiheadattention介绍

初始化参数&#xff1a; class torch.nn.MultiheadAttention(embed_dim, num_heads, dropout0.0, biasTrue, add_bias_kvFalse, add_zero_attnFalse, kdimNone, vdimNone, batch_firstFalse, deviceNone, dtypeNone) 允许模型共同关注来自不同表示子空间的信息。 多头注意力…

C#连接数据库失败,ORA-28040: No matching authentication protocol

C#连接数据库失败 1.原先使用的是oracle11&#xff0c;后来升级数据库到oracle19c&#xff0c;启动程序&#xff0c;数据库连接时报错"ORA-28040: No matching authentication protocol" 2.原因分析&#xff1a;最近服务器数据库版本升级到了19c&#xff0c;网上查了…

【技巧】如何以“只读方式”打开PPT文稿?附两个方法

以“只读方式”打开PPT文稿&#xff0c;可以防止意外修改文稿。今天小编就来介绍一下以“只读方式”打开PPT的两种方法。 方法一&#xff1a;无密码的“只读”模式 1、打开PowerPoint程序&#xff0c;点击菜单中的【文件】选项&#xff0c;再依次点击【打开】-【浏览】。接着在…

FL Studio水果萝卜编曲中文版软件V21版本详细功能介绍

FL Studio十分出色的数字音乐工作软件&#xff0c;其功能大致和Cubase相仿&#xff0c;FL Studio拥有自带的音频插件&#xff0c;并且随着软件的不断更新&#xff0c;使得FL studio不仅仅能够制作电子音乐&#xff0c;同时也能够承担古典、流行等风格的音乐。同时&#xff0c;F…

MySQL:创建数据库,数据表,主键和外键

目录 前言&#xff1a; 安装MySQL&#xff1a; 打开MySQL&#xff1a; 创建数据库&#xff1a; 查看已建数据库&#xff1a; 查看数据库引擎&#xff1a; 创建数据表&#xff1a; 主键约束&#xff1a; 单字段主键&#xff1a; 多字段联合主键&#xff1a; 外键约束&…

《编码——隐藏在计算机软硬件背后的语言》精炼——第11章(门)

“The only source of knowledge is experience.” - Albert Einstein 引言 编码是一种处理并表达信息的方式&#xff0c;它包括摩斯电码、盲文、二进制语言等等&#xff0c;当然作为计算机类的经典书籍&#xff0c;这本书简述了计算机中以二进制数为基础的编码方式&#xff0…

5自由度并联机械臂实现搬运功能

1. 功能说明 本文示例将实现R306样机5自由度并联机械臂搬运牛奶到指定地点的功能。该机械臂由1个5自由度并联机械臂和1个单轴丝杠平台构成&#xff0c;机械臂通过并联的方式同时控制同一个端点的运动。其驱动系统采用大扭矩舵机和小扭矩舵机、执行末端为夹持机构。 2. 并联机械…