1.1.1 C语言常用的一些函数(持续更新)
总框架见(0. 总框架-CSDN博客)
(1)socket
(a)分配fd;(b)分配tcp控制块(tcb)
int socket(int domain, int type, int protocol);AF_INET IPv4 Internet protocols ip(7)AF_INET6 IPv6 Internet protocols ipv6(7)AF_IPX IPX - Novell protocols
(2)bind
把fd和ip绑定到tcp控制块
int bind(int sockfd, const struct sockaddr *addr, socklen_t addrlen);
(3)listen
开始监听fd
int listen(int sockfd, int backlog);
(4)accept
(a)为客户端分配fd;(b)分配tcp控制块(tcb)
int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen);
(5)recv
从内核copy数据到用户空间
ssize_t recv(int sockfd, void *buf, size_t len, int flags);
(6)send
从用户空间copy数据到内核
ssize_t send(int sockfd, const void *buf, size_t len, int flags);
(7)connect
connect客户端发送连接请求
int connect(int sockfd, const struct sockaddr *addr,socklen_t addrlen);
(8)epoll_create
int epoll_create(int size);
(9)epoll_ctl
int epoll_ctl(int epfd, int op, int fd, struct epoll_event *event);EPOLL_CTL_ADD EPOLLIN EPOLLLT EPOLL_CTL_MOD EPOLLOUT EPOLLETEPOLL_CTL_DEL
(10)epoll_wait
int epoll_wait(int epfd, struct epoll_event *events,int maxevents, int timeout);
(11)poll
int poll(struct pollfd *fds, nfds_t nfds, int timeout);
(12)select
int select(int nfds, fd_set *readfds, fd_set *writefds,fd_set *exceptfds, struct timeval *timeout);void FD_CLR(int fd, fd_set *set);int FD_ISSET(int fd, fd_set *set);void FD_SET(int fd, fd_set *set);void FD_ZERO(fd_set *set);
(13)read
ssize_t read(int fd, void *buf, size_t count);参数说明
int fd
文件描述符,表示要读取的文件、管道、套接字或设备。
通常由系统调用(如 open()、socket() 等)返回。
void *buf
指向接收读取数据的缓冲区指针。
系统调用会将读取的数据写入到此缓冲区。
size_t count
要读取的最大字节数,指定缓冲区的大小。返回值
成功时:
返回读取的字节数(可能小于请求的字节数 count)。
返回 0 表示已到达文件末尾(EOF)。
失败时:
返回 -1,并设置全局变量 errno 来指示错误原因
(14)write
ssize_t write(int fd, const void *buf, size_t count);参数说明
int fd
文件描述符,表示数据要写入的目标。
通常由 open() 或 socket() 等函数返回。
const void *buf
指向包含要写入数据的缓冲区的指针。
size_t count
指定要写入的字节数返回值
成功时:
返回实际写入的字节数(可能小于请求的字节数 count)。
失败时:
返回 -1,并设置全局变量 errno 表示错误原因。
(15)fork
创建的新进程,它是父进程的一个副本,几乎所有的数据(变量、文件描述符等)都会被复制。
返回值
父进程中:fork() 返回子进程的 PID(正整数)。
子进程中:fork() 返回 0。
出错时:返回 -1,同时设置 errno
(16)perror
读取系统定义的全局变量 errno,然后通过查找对应的错误码输出一个与其相关联的错误消息
int main() {int fd = open("nonexistent_file.txt", O_RDONLY);if (fd == -1) {perror("Error opening file");}return 0;输出:
Error opening file: No such file or directory
(17)strerror
如果需要获取错误描述并在代码中使用,而不是直接打印,可以使用 strerror(errno)。
#include <string.h>
printf("Error: %s\n", strerror(errno));
(18)atoi
是 C 标准库中用于将字符串转换为整数的函数。atoi 是 ASCII to Integer 的缩写。
int atoi(const char *str);参数
str
指向需要转换的字符串(应以空字符 \0 结束)。返回值
如果字符串可以成功解析为整数,则返回该整数值。
如果字符串不包含有效的数字,则返回值可能为 0(不安全,推荐使用 strtol 替代)。int main() {char str1[] = " -456";char str2[] = "+789";printf("Converted number 1: %d\n", atoi(str1)); // Output: -456printf("Converted number 2: %d\n", atoi(str2)); // Output: 789return 0;
}
(19)strcmp
是 C 标准库中的一个函数,用于比较两个字符串的大小(基于字典序)。
int strcmp(const char *str1, const char *str2);参数解释
str1
指向第一个字符串的指针。
str2
指向第二个字符串的指针返回值
小于 0
如果 str1 的字典序小于 str2。
等于 0
如果 str1 和 str2 内容完全相同。
大于 0
如果 str1 的字典序大于 str2int main() {char str1[] = "apple";char str2[] = "banana";int result = strcmp(str1, str2);printf("Result: %d\n", result); // Output: Result: negative value (e.g., -1)return 0;
}
(20)memset
是 C 标准库中的一个函数,主要用于对一块内存区域进行初始化或设置。
void *memset(void *s, int c, size_t n);参数说明
void *s
指向要初始化的内存区域的起始地址。
int c
用于设置的值,会被解释为一个 unsigned char(0 到 255),然后复制到内存区域。
size_t n
要设置的字节数。返回值
返回指向内存区域 s 的指针。
功能
将指定的值填充到连续的内存区域中。
常用于数组或结构体的初始化。常见用途
功能1:初始化数组
使用 memset 将数组清零或设置为某个默认值。
int arr[10];
memset(arr, 0, sizeof(arr)); // 初始化为 0功能2:清空结构体中的所有成员变量。
struct Data {int a;char b[20];
} data;
memset(&data, 0, sizeof(data)); // 将结构体清零
(21)memcpy
是 C 标准库中的一个函数,将内存块中的数据从一个位置复制到另一个位置。
void *memcpy(void *dest, const void *src, size_t n);参数说明
void *dest
目标内存地址,表示复制数据的目的地。
const void *src
源内存地址,表示复制数据的来源。
size_t n
要复制的字节数。返回值
返回目标内存地址 (dest) 的指针。基本用法
int main() {char src[] = "Hello, World!";char dest[20];memcpy(dest, src, strlen(src) + 1); // 复制 src 到 destprintf("Source: %s\n", src);printf("Destination: %s\n", dest);return 0;
}输出:
Source: Hello, World!
Destination: Hello, World!int main() {int src[5] = {1, 2, 3, 4, 5};int dest[5];memcpy(dest, src, 5 * sizeof(int)); // 复制 5 个整型值for (int i = 0; i < 5; i++) {printf("dest[%d] = %d\n", i, dest[i]);}return 0;
}输出:
dest[0] = 1
dest[1] = 2
dest[2] = 3
dest[3] = 4
dest[4] = 5应用场景
字符串操作:复制字符串的原始字节数据(与 strcpy 的主要区别是 memcpy 可以复制非空终止的二进制数据)。
数组复制:处理任意类型的数组,例如 int 或 float。
内存初始化:与 memset 配合使用,分配和初始化内存。
结构体复制:在需要字节级拷贝时,处理复杂结构体数据。
(22)strncpy
复制字符串的指定长度
char *strncpy(char *dest, const char *src, size_t n);参数说明
char *dest
目标字符数组的指针,复制后的字符串将存储在这里。
const char *src
源字符串的指针,要被复制的字符串内容。
size_t n
要复制的最大字符数。如果 src 长度小于 n,则目标字符串会填充空字符(\0);如果 src 长度大于或等于 n,则目标字符串不会被空字符终止。返回值
返回 dest 指针,即目标字符串的指针。功能
将源字符串 src 复制到目标字符数组 dest 中,最多复制 n 个字符。
如果源字符串长度小于 n,strncpy 会用空字符(\0)填充目标字符串的剩余部分;如果源字符串长度大于或等于 n,目标字符串没有终止符(\0)。与 strcpy 的对比
strcpy:直接复制整个字符串,直到遇到终止符 \0。无法防止溢出。
例如:strcpy(dest, src);
strncpy:复制指定数量的字符,并会根据情况使用终止符 \0 填充目标字符串。
更安全,因为可以限制复制的字符数,防止溢出int main() {char src[] = "Hello, World!";char dest[20];// 将最多 10 个字符从 src 复制到 deststrncpy(dest, src, 10);dest[10] = '\0'; // 确保终止符printf("Copied string: %s\n", dest); // 输出: Hello, Woreturn 0;
}代码解析
strncpy(dest, src, 10);:最多复制 10 个字符。
然后手动添加终止符 dest[10] = '\0';,这是因为源字符串可能没有包含终止符(在字符串更长的情况下)。
结果是 dest 中的内容为 "Hello, Wo",因为 src 前 10 个字符被复制。
(23)strlen
size_t strlen(const char *str);功能
strlen 用于计算字符串的长度(不包括终止符 \0)。
它会遍历字符串直到遇到第一个空字符 \0 为止,并返回已遍历的字符数。
参数说明
const char *str
指向以空字符 \0 结尾的字符串。
返回值
返回字符串的长度(不包括终止符 \0)的大小,以 size_t 类型表示。int main() {char str[] = "Hello, World!";size_t length = strlen(str);printf("The length of the string is: %zu\n", length); // 输出: 13return 0;
}代码解析
字符串 str[]:
包含 "Hello, World!",长度为 13(不包括终止符 \0)。
strlen(str):
遍历字符串,直到遇到终止符 \0。
计算字符数:'H', 'e', 'l', 'l', 'o', ',', ' ', 'W', 'o', 'r', 'l', 'd', '!'。
返回值:
返回 13,表示字符串的长度与 sizeof 的对比
strlen运行时计算字符串长度。适用于动态字符串。不包括终止符 \0。
sizeof编译时计算数组大小(字节数)。适用于固定大小的字符数组。包括终止符 \0 的大小。
示例:
char str1[] = "Hello";
char *str2 = "Hello";
printf("strlen(str1): %zu\n", strlen(str1)); // 输出 5
printf("sizeof(str1): %zu\n", sizeof(str1)); // 输出 6
printf("strlen(str2): %zu\n", strlen(str2)); // 输出 5
printf("sizeof(str2): %zu\n", sizeof(str2)); // 输出 8 (指针大小)
(24)snprint
用于将格式化的数据写入字符串,并确保不会溢出字符串缓冲区。它是 sprintf 的更安全版本,避免了可能的缓冲区溢出问题。
int snprintf(char *str, size_t size, const char *format, ...);参数说明
char *str
指向要写入格式化输出的字符数组。
size_t size
指定目标字符串的最大大小,包括结尾的 '\0'(空字符)。snprintf 确保总输出长度不超过这个值。
const char *format
格式化字符串,与 printf 的格式化字符串类似,例如 %d, %s, %f 等。
... (可变参数)
需要插入到格式化字符串中的数据返回值
返回写入的字符数,不包括终止的 \0 字符:
如果 size 足够大,返回值是实际写入的字符数。
如果 size 不够大,返回值是本应该写入的字符数(截断的字符串长度)。缓冲区不足的情况
int main() {char buffer[10];int num = 123456;int written = snprintf(buffer, sizeof(buffer), "Number: %d", num);printf("Formatted string: %s\n", buffer); // 输出截断的内容printf("Characters written: %d\n", written); // 返回未截断的实际字符数return 0;
}输出:
Formatted string: Number: 1
Characters written: 12
说明:
缓冲区 buffer 长度为 10,无法容纳完整字符串 "Number: 123456"。
结果字符串被截断为 "Number: 1",但 snprintf 的返回值是实际所需的字符数 12
(25)malloc
堆上分配内存,并返回指向分配内存块的指针。
void *malloc(size_t size);参数说明
size
请求分配的内存大小(以字节为单位)。size 必须大于 0。返回值
返回分配的内存的起始地址,类型是 void*,即通用指针。
如果内存分配失败(比如系统没有足够的内存),malloc 返回 NULL。特性
动态内存分配
malloc 函数从程序的堆内存区域(Heap)分配指定大小的内存。在堆上分配的内存空间不会随着函数调用结束而销毁,必须通过 free 显式释放。基本用法
int main() {int *arr = (int *)malloc(5 * sizeof(int)); // 动态分配 5 个整数的空间if (arr == NULL) {printf("Memory allocation failed!\n");return 1;}for (int i = 0; i < 5; i++) {arr[i] = i + 1;printf("%d ", arr[i]);}printf("\n");free(arr); // 释放内存return 0;
}输出:
1 2 3 4 5
(26)free
用于释放由动态内存分配函数(如 malloc、calloc 或 realloc)分配的内存。将之前分配的动态内存归还给操作系统或内存管理器。释放后,该内存块可以被再次分配和使用。
void free(void *ptr);参数说明
void *ptr
动态分配的内存块的指针,该指针通常是通过 malloc、calloc 或 realloc 返回的。
如果 ptr 是 NULL,free 不会进行任何操作。基本用法
int main() {int *arr = (int *)malloc(5 * sizeof(int)); // 动态分配 5 个整数的空间if (arr == NULL) {perror("malloc failed");return 1;}for (int i = 0; i < 5; i++) {arr[i] = i + 1;printf("%d ", arr[i]);}printf("\n");free(arr); // 释放内存arr = NULL; // 避免悬空指针return 0;
}输出:
1 2 3 4 5常见问题
1. 为什么释放未分配的内存是危险的?
如果尝试 free 一个未分配的指针,可能会导致程序崩溃或者未定义行为,因为内存管理器试图释放一个它没有跟踪的内存区域。
2. 为什么要将指针置为 NULL?
避免悬空指针(Dangling Pointer)。
悬空指针是指指向已释放内存区域的指针,如果不小心使用它(如读写操作),可能会导致不可预测的错误。
3. 始终配对 malloc 和 free,避免内存泄漏和悬空指针。
相关文章:
1.1.1 C语言常用的一些函数(持续更新)
总框架见(0. 总框架-CSDN博客) (1)socket (a)分配fd;(b)分配tcp控制块(tcb) int socket(int domain, int type, int protocol);AF_INET IPv4 Internet protocols ip(7)AF_INET6 IP…...

李宏毅机器学习课程笔记03 | 类神经网络优化技巧
文章目录 类神经网络优化技巧局部最小值local minima 与 鞍点saddle pointSaddle Point 的情况更常见 Tips for training:Batch and MomentumSmall Batch vs Large Batch回顾:optimization优化 找到参数使L最小问题:为什么要用Batchÿ…...
简洁明快git入门及github实践教程
简洁明快git入门及github快速入门实践教程 前言git知识概要:一:什么是 Git?二:安装 Git三:配置 Git配置git的用户名和邮箱地址创建仓库 四:Git实践五:远程仓库操作(基于git命令使用G…...
Python使用socket实现简易的http服务
在接触的一些项目中,有时为了方便可视化一些服务状态(请求数很少),那么很容易想到使用http服务来实现。但开源的web后端框架,例如flask,fastapi,django等略显沉重,且使用这些框架会有…...

【Hive】海量数据存储利器之Hive库原理初探
文章目录 一、背景二、数据仓库2.1 数据仓库概念2.2 数据仓库分层架构2.2.1 数仓分层思想和标准2.2.2 阿里巴巴数仓3层架构2.2.3 ETL和ELT2.2.4 为什么要分层 2.3 数据仓库特征2.3.1 面向主题性2.3.2 集成性2.3.3 非易失性2.3.4 时变性 三、hive库3.1 hive概述3.2 hive架构3.2.…...
linux系统监视(centos 7)
一.系统监视 1.安装iostat,sar,sysstat(默认没有,安装过可以跳跃) iostat 和 sar: 同样,iostat 和 sar 是 sysstat 软件包的一部分。使用以下命令安装:sudo yum install sysstat解释…...
Blazor中Syncfusion图像编辑器组件使用方法
Blazor中Syncfusion图像编辑器组件是一个功能丰富的图像处理工具,支持多种编辑、操作和交互方式,帮助用户高效处理图像。以下是该组件的主要功能总结: 主要功能: 图像打开与保存 图像编辑器允许用户通过简单的点击操作打开支持的…...

电动汽车V2G技术Matlab/Simulink仿真模型
今天给大家更新关于V2G技术的仿真,不是研究这个方向的,可能会对这个名称比较陌生,那么,什么是“V2G”? V2G全称:Vehicle-to-Grid,即车网互动,利用电动汽车特有的储能功能与电网“双…...

C++中的unordered_set和unordered_map的模拟实现
一、封装基本结构 与map和set的封装过程很想,unordered_set和unordered_map也需要用MapKeyOfT和SetKeyOfT创建哈希表类型,借此获取对应的key值来使用; 因此,在哈希表中也一样需要用参数class T来替代set中的key和map中的pair<…...

Spring Boot 2 学习指南与资料分享
Spring Boot 2 学习资料 Spring Boot 2 学习资料 Spring Boot 2 学习资料 在当今竞争激烈的 Java 后端开发领域,Spring Boot 2 凭借其卓越的特性,为开发者们开辟了一条高效、便捷的开发之路。如果你渴望深入学习 Spring Boot 2,以下这份精心…...
(一)QSQLite3库简介
1、SQLite数据库 SQLite数据库,作为一个轻量级的关系型数据库管理系统,广泛应用于移动设备和桌面应用程序中。由于其简单易用、无需配置的特点,它为开发者提供了极大的便利。然而,正是由于其应用广泛,随着用户对于系统…...

《计算机网络》课后探研题书面报告_网际校验和算法
网际校验和算法 摘 要 本文旨在研究和实现网际校验和(Internet Checksum)算法。通过阅读《RFC 1071》文档理解该算法的工作原理,并使用编程语言实现网际校验和的计算过程。本项目将对不同类型的网络报文(包括ICMP、TCP、UDP等&a…...

hot100_240. 搜索二维矩阵 II
hot100_240. 搜索二维矩阵 II 直接遍历列减行增 编写一个高效的算法来搜索 m x n 矩阵 matrix 中的一个目标值 target 。该矩阵具有以下特性: 每行的元素从左到右升序排列。 每列的元素从上到下升序排列。 示例 1: 输入:matrix [[1,4,7,1…...
78_Redis网络模型
1.Redis网络模型概述 1.1 Redis网络模型介绍 Redis 7.x的网络模型基于epoll的Reactor模式实现,这是一个高效的事件驱动模型。在Redis中,所有的网络事件(如连接、读写等)都由一个事件循环(Event Loop)来处理。这个事件循环负责监听套接字上的事件,并根据事件类型调用相…...
python范围
用户图形界面-工资计算器 from tkinter import *def f():w int(e1.get()) int(e2.get()) - int(e3.get())wage.insert(0,w)root Tk() root.title("工资计算器") Label(root, text"每月基本工资:").pack() e1 Entry(root) e1.pack() Label(…...

vulnhub靶场【Raven系列】之2 ,对于mysql udf提权的复习
前言 靶机:Raven-2,IP地址为192.168.10.9 攻击:kali,IP地址为192.168.10.2 都采用虚拟机,网卡为桥接模式 文章所用靶机来自vulnhub,可通过官网下载,或者通过链接:https://pan.quark.cn/s/a65…...

基于vite+vue3+mapbox-gl从零搭建一个项目
下面是基于 Vite、Vue 3 和 Mapbox GL 从零搭建一个项目的完整步骤,包括环境搭建、依赖安装、配置和代码示例。 1. 初始化项目 首先,使用 Vite 快速创建一个 Vue 3 项目: npm create vuelatest vue3-mapboxgl --template vue cd vue3-mapbo…...
向harbor中上传镜像(向harbor上传image)
向 Harbor 中上传镜像通常分为以下几个步骤: 1、登录 Harbor 2、构建镜像 3、标记镜像 4、推送镜像到 Harbor 仓库 1、登录 Harbor 首先,确保你已经能够访问 Harbor,并且已经注册了账户。如果还没有 Harbor 账户,你需要先注册一…...
【线性代数】行列式的性质
行列式性质定理讲义 一、行列式的基本性质 性质 1:行列互换 对于任意一个 n n n \times n nn 的方阵 A A A,其行列式 ∣ A ∣ |A| ∣A∣ 满足: ∣ A ∣ ∣ A T ∣ |A| |A^T| ∣A∣∣AT∣ 其中, A T A^T AT 是 A A A 的…...

智能家居企业如何通过设计师渠道打造第二曲线?
随着智能家居行业的迅速发展和消费者需求的不断升级,企业的营销策略也在不断变化。传统的B2C营销模式逐渐让位于更加精细化、定制化的B2B2C模式,其中设计师渠道的开发与合作,成为智能家居企业布局市场、提升品牌影响力的关键。 智能家居推广的…...
uniapp 对接腾讯云IM群组成员管理(增删改查)
UniApp 实战:腾讯云IM群组成员管理(增删改查) 一、前言 在社交类App开发中,群组成员管理是核心功能之一。本文将基于UniApp框架,结合腾讯云IM SDK,详细讲解如何实现群组成员的增删改查全流程。 权限校验…...
谷歌浏览器插件
项目中有时候会用到插件 sync-cookie-extension1.0.0:开发环境同步测试 cookie 至 localhost,便于本地请求服务携带 cookie 参考地址:https://juejin.cn/post/7139354571712757767 里面有源码下载下来,加在到扩展即可使用FeHelp…...
论文解读:交大港大上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化学习框架(二)
HoST框架核心实现方法详解 - 论文深度解读(第二部分) 《Learning Humanoid Standing-up Control across Diverse Postures》 系列文章: 论文深度解读 + 算法与代码分析(二) 作者机构: 上海AI Lab, 上海交通大学, 香港大学, 浙江大学, 香港中文大学 论文主题: 人形机器人…...
React Native 导航系统实战(React Navigation)
导航系统实战(React Navigation) React Navigation 是 React Native 应用中最常用的导航库之一,它提供了多种导航模式,如堆栈导航(Stack Navigator)、标签导航(Tab Navigator)和抽屉…...
【磁盘】每天掌握一个Linux命令 - iostat
目录 【磁盘】每天掌握一个Linux命令 - iostat工具概述安装方式核心功能基础用法进阶操作实战案例面试题场景生产场景 注意事项 【磁盘】每天掌握一个Linux命令 - iostat 工具概述 iostat(I/O Statistics)是Linux系统下用于监视系统输入输出设备和CPU使…...

04-初识css
一、css样式引入 1.1.内部样式 <div style"width: 100px;"></div>1.2.外部样式 1.2.1.外部样式1 <style>.aa {width: 100px;} </style> <div class"aa"></div>1.2.2.外部样式2 <!-- rel内表面引入的是style样…...
laravel8+vue3.0+element-plus搭建方法
创建 laravel8 项目 composer create-project --prefer-dist laravel/laravel laravel8 8.* 安装 laravel/ui composer require laravel/ui 修改 package.json 文件 "devDependencies": {"vue/compiler-sfc": "^3.0.7","axios": …...

关键领域软件测试的突围之路:如何破解安全与效率的平衡难题
在数字化浪潮席卷全球的今天,软件系统已成为国家关键领域的核心战斗力。不同于普通商业软件,这些承载着国家安全使命的软件系统面临着前所未有的质量挑战——如何在确保绝对安全的前提下,实现高效测试与快速迭代?这一命题正考验着…...

算法笔记2
1.字符串拼接最好用StringBuilder,不用String 2.创建List<>类型的数组并创建内存 List arr[] new ArrayList[26]; Arrays.setAll(arr, i -> new ArrayList<>()); 3.去掉首尾空格...
C++课设:简易日历程序(支持传统节假日 + 二十四节气 + 个人纪念日管理)
名人说:路漫漫其修远兮,吾将上下而求索。—— 屈原《离骚》 创作者:Code_流苏(CSDN)(一个喜欢古诗词和编程的Coder😊) 专栏介绍:《编程项目实战》 目录 一、为什么要开发一个日历程序?1. 深入理解时间算法2. 练习面向对象设计3. 学习数据结构应用二、核心算法深度解析…...