<stdlib.h>头文件: C 语言常用标准库函数详解
文章目录
- 引言
- 1. `<stdlib.h>` 概览
- 1.1 头文件包含
- 2. 内存管理函数
- 2.1 `malloc` 函数
- 2.2 `calloc` 函数
- 2.3 `realloc` 函数
- 2.4 `free` 函数
- 3. 随机数生成函数
- 3.1 `rand` 函数
- 3.2 `srand` 函数
- 4. 字符串转换函数
- 4.1 `atoi` 函数
- 4.2 `atof` 函数
- 4.3 `itoa` 函数
- 4.4 `ltoa` 函数
- 4.5 `ultoa`函数
- 5 其他函数
- 5.1 `qsort`函数
- compare 的示例
- 5.1 `swab`函数
- 5.12`bsearch`函数
- 结语
引言
在C语言中,<stdlib.h>
是一个重要的头文件,它包含了一些标准库函数,提供了内存分配、随机数生成、字符串转换等功能。本博客将深入解析 <stdlib.h>
头文件,介绍其中一些常用函数的用法和实现原理。
1. <stdlib.h>
概览
<stdlib.h>
是 C 标准库的一部分,它定义了一些宽泛的实用函数。这些函数通常涉及内存管理、伪随机数生成、整数转换等方面。
1.1 头文件包含
在使用 <stdlib.h>
头文件之前,我们通常会在程序中包含以下语句:
#include <stdlib.h>
这样可以确保我们在程序中使用标准库函数时能够正确调用相应的功能。
2. 内存管理函数
2.1 malloc
函数
- 功能:
malloc
函数用于在堆上分配一块指定大小的内存空间。成功时返回指向分配内存的指针,失败时返回NULL
。 - 原型:
void* malloc(size_t size);
#include <stdio.h>
#include <stdlib.h>int main() {// 定义一个指针,分配包含 5 个整数的内存块int *dynamicArray = (int *)malloc(5 * sizeof(int));// 检查内存是否成功分配if (dynamicArray == NULL) {printf( "内存分配失败\n");return 1; // 返回错误代码}// 向动态数组中写入数据int i;for (i = 0; i < 5; ++i) {dynamicArray[i] = i * 2;}// 输出动态数组的内容printf("动态数组的内容:\n");for (i = 0; i < 5; ++i) {printf("%d ", dynamicArray[i]);}// 释放动态分配的内存free(dynamicArray);return 0;
}
动态数组的内容:
0 2 4 6 8
2.2 calloc
函数
- 功能:
calloc
函数用于在堆上分配一块指定数量和大小的内存空间,与malloc
不同的是,calloc
会将分配的内存块初始化为零。 - 原型:
void* calloc(size_t num, size_t size);
例如
int*
初始化就是0
char*
初始化就是’\0’
#include <stdio.h>
#include <stdlib.h>int main() {// 定义一个指针,用于存储分配的内存地址int *dynamicArray;// 使用 calloc 分配包含 5 个整数的内存块dynamicArray = (int *)calloc(5, sizeof(int));// 检查内存是否成功分配if (dynamicArray == NULL) {fprintf(stderr, "内存分配失败\n");return 1; // 返回错误代码}// 输出动态数组的内容,此时数组已被初始化为零printf("动态数组的内容:\n");int i;for (i = 0; i < 5; ++i) {printf("%d ", dynamicArray[i]);}// 释放动态分配的内存free(dynamicArray);return 0;
}
动态数组的内容:
0 0 0 0 0
2.3 realloc
函数
- 功能:
realloc
函数用于修改之前由malloc
、calloc
或realloc
分配的内存块的大小。它可以用于扩大或缩小内存块。 - 原型:
void* realloc(void* ptr, size_t size);
#include <stdio.h>
#include <stdlib.h>int main() {// 初始分配 10 个整数大小的内存块int *arr = (int *)malloc(10 * sizeof(int));if (arr == NULL) {fprintf(stderr, "内存分配失败\n");return 1;}printf("初始分配内存后的地址:%p\n", (void *)arr);// 使用 realloc 缩小内存块到 5 个整数大小int *newArr = (int *)realloc(arr, 5 * sizeof(int));if (newArr == NULL) {fprintf(stderr, "内存重新分配失败\n");free(arr); // 如果 realloc 失败,需要释放原始的内存块return 1;}printf("缩小内存后的地址:%p\n", (void *)newArr);// 现在 newArr 可以用于存储 5 个整数// 不要忘记释放内存free(newArr);return 0;
}
2.4 free
函数
- 功能:
free
函数用于释放之前由malloc
、calloc
或realloc
分配的内存空间。释放后,该指针不再指向有效的内存区域。 - 原型:
void free(void* ptr);
// 例子
free(arr);
3. 随机数生成函数
3.1 rand
函数
- 功能:
rand
函数用于生成一个伪随机数。每次调用rand
都会返回一个范围在 0 到RAND_MAX
之间的整数。 - 原型:
int rand(void);
请注意,rand 函数生成的是伪随机数,其实际上是通过一定的算法计算的,因此不是真正的随机数。
#include <stdio.h>
#include <stdlib.h>int main() {int randomNum1 = rand();int randomNum2 = rand();// 打印随机数printf("Random Number 1: %d\n", randomNum1);printf("Random Number 2: %d\n", randomNum2);return 0;
}
// 第一次运行
Random Number 1: 41
Random Number 2: 18467// 第二次运行
Random Number 1: 41
Random Number 2: 18467
...
3.2 srand
函数
- 功能:
srand
函数用于设置rand
函数的种子值,以便生成不同的随机数序列。 - 原型:
void srand(unsigned int seed);
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main() {// 没有使用 srand 设置种子printf("未使用 srand:\n");int i;for (i = 0; i < 5; ++i) {printf("%d ", rand());}// 使用 srand 设置种子srand(time(NULL)); // 42 只是一个示例种子值,可以是任何值printf("\n使用 srand:\n");for (i = 0; i < 5; ++i) {printf("%d ", rand());}return 0;
}
// 第一次运行
未使用 srand:
41 18467 6334 26500 19169
使用 srand:
29346 6213 16299 17151 17694// 第二次运行
未使用 srand:
41 18467 6334 26500 19169
使用 srand:
29372 26664 28140 13050 1907...
在这个例子中,
srand(time(NULL))
使用当前时间作为随机数生成器的种子。由于时间每次都在变化,这样就能确保每次运行程序都会得到不同的随机数序列。
4. 字符串转换函数
4.1 atoi
函数
- 功能:
atoi
函数用于将字符串转换为整数。 - 原型:
int atoi(const char* str);
#include <stdio.h>
#include <stdlib.h>int main() {// 定义一个字符串char str1[] = "12345";char str2[] = "12345abdc";// 使用atoi将字符串转换为整数int num1 = atoi(str1);int num2 = atoi(str2);// 打印结果printf("String str1: %s\n", str1);printf("Integer int1: %d\n", num1);printf("String str2: %s\n", str2);printf("Integer int2: %d\n", num2);return 0;
}
String str1: 12345
Integer int1: 12345
String str2: 12345abdc
Integer int2: 12345
4.2 atof
函数
- 功能:
atof
函数用于将字符串转换为浮点数。 - 原型:
double atof(const char* str);
#include <stdio.h>
#include <stdlib.h>int main() {// 定义字符串char str1[] = "12345.137";char str2[] = "12345.111abdc";// 使用atof将字符串转换为浮点数double num1 = atof(str1);double num2 = atof(str2);// 打印结果printf("字符串 str1:%s\n", str1);printf("浮点数 num1:%lf\n", num1);printf("字符串 str2:%s\n", str2);printf("浮点数 num2:%lf\n", num2);return 0;
}
字符串 str1:12345.137
浮点数 num1:12345.137000
字符串 str2:12345.111abdc
浮点数 num2:12345.111000
4.3 itoa
函数
- 功能:
itoa
函数用于将整数转换为字符串。它接受三个参数:要转换的整数value
,存储结果的字符串指针str
,和进制base
。base
可以是 2 到 36 之间的任意值,表示输出的字符串使用的进制。 - 原型:
char* itoa(int value, char* str, int base);
#include <stdio.h>
#include <stdlib.h>int main() {// 定义整数int num1 = 12345;int num2 = -6789;// 定义足够大的字符数组来存储转换后的字符串char str1[20];char str2[20];// 使用 itoa 将整数转换为字符串itoa(num1, str1, 10); // 第三个参数是基数,这里使用10进制itoa(num2, str2, 10);// 打印结果printf("整数 num1:%d\n", num1);printf("字符串 str1:%s\n", str1);printf("整数 num2:%d\n", num2);printf("字符串 str2:%s\n", str2);return 0;
}
整数 num1:12345
字符串 str1:12345
整数 num2:-6789
字符串 str2:-6789
4.4 ltoa
函数
- 功能:将长整型转换为字符串,参数和用法与
itoa
类似- - 原型:
char* ltoa(long value, char* str, int base);
#include <stdio.h>
#include <stdlib.h>int main() {// 定义整数long num1 = 12345;long num2 = 987654321;// 使用ltoa将整数转换为字符串char str1[20]; // 假设足够大以容纳转换后的字符串char str2[20]; ltoa(num1, str1, 10);ltoa(num2, str2, 10);// 打印结果printf("整数 num1:%ld\n", num1);printf("字符串 str1:%s\n", str1);printf("整数 num2:%ld\n", num2);printf("字符串 str2:%s\n", str2);return 0;
}
整数 num1:12345
字符串 str1:12345
整数 num2:987654321
字符串 str2:987654321
4.5 ultoa
函数
- 功能:将无符号长整型转换为字符串,参数和用法与
itoa
类似 - 原型:
char* ultoa(unsigned long value, char* str, int base);
#include <stdio.h>
#include <stdlib.h>int main() {// 定义无符号长整型数unsigned long num1 = 12345;unsigned long num2 = 879631;// 定义存储转换后字符串的数组char str1[20]; // 大小需要足够存储转换后的字符串char str2[20];// 使用 ultoa 将无符号长整型数转换为字符串ultoa(num1, str1, 10);ultoa(num2, str2, 10);// 打印结果printf("无符号长整型数 num1: %lu\n", num1);printf("字符串 str1: %s\n", str1);printf("无符号长整型数 num2: %lu\n", num2);printf("字符串 str2: %s\n", str2);return 0;
}
String str1: 12345
Integer int1: 12345
String str2: 879631
Integer int2: 879631
5 其他函数
5.1 qsort
函数
qsort & bsearch 实现二分查找
- 功能:用于对数组进行快速排序的函数
- 原型:
void qsort(void *base, size_t nmemb, size_t size, int (*compar)(const void *, const void *));
下面对函数的参数进行详解:
base
:指向要排序的数组的起始地址的指针。nmemb
:数组中元素的个数。size
:数组中每个元素的大小(以字节为单位)。compar
:比较函数的指针。这个函数用于定义数组元素之间的比较规则。它接受两个指向元素的指针,比较这两个元素的大小,并返回一个整数,表示它们的相对顺序。比较函数的返回值有三种情况:- 若返回值小于 0,则表示第一个元素要在第二个元素后面
- 若返回值等于 0,不进行操作
- 若返回值大于 0,则表示第一个元素要在第二个元素之前
qsort
函数使用快速排序算法,这是一种高效的排序算法,平均时间复杂度为 O(n log n)。排序是在原地进行的,不需要额外的辅助数组。
以下是一个简单的示例,演示如何使用 qsort
函数:
#include <stdio.h>
#include <stdlib.h>// 比较函数
int compare(const void *a, const void *b) {return (*(int *)a - *(int *)b);
}int main() {int arr[] = {5, 2, 9, 1, 5, 6};size_t n = sizeof(arr) / sizeof(arr[0]);// 调用 qsort 函数进行排序qsort(arr, n, sizeof(arr[0]), compare);// 输出排序后的数组for (size_t i = 0; i < n; i++) {printf("%d ", arr[i]);}return 0;
}
1 2 5 5 6 9
在这个例子中,
compare
函数用于比较整数,将数组元素按升序排序。qsort
函数将会根据compare
函数的定义对数组进行排序。在实际使用中,可以根据需要定义不同的比较函数来实现不同的排序规则。
compare 的示例
整型
int cmp_int(const void* e1, const void* e2)
{return *(int*)e1 - *(int*)e2;
}
浮点型
int cmp_float(const void* e1, const void* e2)
{return (int)(*(float*)e1 - *(float*)e2);
}
字符串
int cmp_str_size(const void* e1, const void* e2)
{return strcmp((char*)e1,(char*)e2);
}
字符串的长度
int cmp_str_len(const void* e1, const void* e2)
{return strlen((char*)e1)-strlen((char*)e2);
}
结构体
int cmp_by_age(const void*e1, const void*e2)
{return (int)(((stu*)e1)->weight - ((stu*)e2)->weight);
}
需要注意的是:返回结果一定要确保是整形,如果不是一定要强制类型转换成整形!
5.1 swab
函数
- 功能:在不同字节序之间交换数据
- 原型:
void swab(char *from,char *to,int n);
#include<stdio.h>
#include<stdlib.h>
#include<string.h>int main(void){char suc[20]={"1234567890"};char des[20];swab(suc,des,strlen(suc));printf("This is suc: %s\n",suc);printf("This is dest: %s\n",des);return 0;}
This is suc: 1234567890
This is dest: 2143658709
5.12bsearch
函数
qsort & bsearch 实现二分查找
- 功能:用于二分法搜索
- 原型:
void *bsearch(const void *key, const void *base, size_t nmemb, size_t size, int (*compar)(const void *, const void *));
参数说明:
key
:要查找的元素的指针,即要在数组中查找的元素。base
:指向已排序数组的起始地址的指针。nmemb
:数组中元素的个数。size
:每个元素的大小(以字节为单位)。compar
:比较函数的指针,用于定义元素之间的比较规则。该函数应返回一个整数,表示两个元素的相对顺序。
bsearch
函数的返回值是一个指向匹配元素的指针,如果找到匹配的元素,则返回指向该元素的指针;如果没有找到匹配的元素,则返回NULL
。
比较函数compar
的原型如下:
int compar(const void *a, const void *b);
比较函数应该返回一个整数,其含义如下:
- 如果
a
小于b
,则返回负值。 - 如果
a
等于b
,则返回零。 - 如果
a
大于b
,则返回正值。
#include <stdio.h>
#include <stdlib.h>// 比较函数,用于定义整数之间的比较规则
int compareIntegers(const void *a, const void *b) {return (*(int*)a - *(int*)b);
}int main() {int arr[] = {1, 2, 4, 6, 8, 10, 12, 14, 16, 18};int size = sizeof(arr) / sizeof(arr[0]);int key = 12;// 使用bsearch在已排序数组中查找元素int *result = (int*)bsearch(&key, arr, size, sizeof(arr[0]), compareIntegers);if (result != NULL) {printf("元素 %d 找到在数组中的位置:%ld\n", key, result - arr);} else {printf("元素 %d 未找到\n", key);}return 0;
}
元素 12 找到在数组中的位置:6
结语
<stdlib.h>
头文件提供了许多在 C 语言中常用的功能,从内存管理到随机数生成,再到字符串转换,都有涉及。熟练掌握这些函数的用法,有助于提高程序的效率和可维护性。
请记得在使用这些函数时要注意内存的分配和释放,以免造成内存泄漏和其他不稳定的行为。希望本博客对你理解和使用 <stdlib.h>
有所帮助。如有疑问或建议,欢迎留言讨论。
相关文章:
<stdlib.h>头文件: C 语言常用标准库函数详解
文章目录 引言1. <stdlib.h> 概览1.1 头文件包含 2. 内存管理函数2.1 malloc 函数2.2 calloc 函数2.3 realloc 函数2.4 free 函数 3. 随机数生成函数3.1 rand 函数3.2 srand 函数 4. 字符串转换函数4.1 atoi 函数4.2 atof 函数4.3 itoa 函数4.4 ltoa 函数4.5 ultoa函数 5…...

Qt前端技术:3.QSS字体样式
small-caps就是让这个文本中的小写字母用大写的形式写出来并且在用大写的形式表达出来后他本身的大小会变小 有绝对尺寸和相对尺寸的区别 绝对尺寸一般是cm,英寸之类的 相对尺寸如px之类的是由显示器的屏幕分辨率来决定的 如windows用户分辨率一般是96像素点每英…...

阿里面试官:面试了一个能力相当不错的候选人,但背调时,他前同事和领导都说他人品很差,纠结该不该要他?...
* 你好,我是前端队长,在职场,玩副业,文末有福利! 在职场中,背调是个躲不开的事情。不管是各行各业背调可能都存在,只是形式不同而已。而且现在大环境不好,可能对个人的要求还更高一些。 背调的主…...

如何设计树形结构
作者简介:大家好,我是smart哥,前中兴通讯、美团架构师,现某互联网公司CTO 联系qq:184480602,加我进群,大家一起学习,一起进步,一起对抗互联网寒冬 前置知识:前…...

限量25台,川崎亮相Ninja ZX-10RR冬季限量款
最近川崎发布了自家ZX-10RR的超级限量版,官方称之为冬季测试版,之前也有一些车型推出过冬季测试版,通常是在年底推出,因为这个时候北半球都是非常寒冷的冬天。 不过这台ZX-10RR冬季测试版,并不仅仅只是限量那么简单&am…...

【QT八股文】系列之篇章1 | QT的基础知识及事件/机制
【QT八股文】系列之篇章1 | QT的基础知识及事件/机制 前言0. 基础Qt/PyQt5介绍/关联Qt的优缺点(为什么要用qt来做界面)Qt 的核心机制请简要介绍一下Qt中的主窗口(MainWindow)类,它有哪些重要的函数和成员变量ÿ…...

SpringBoot 3 集成Hive 3
前提条件: 运行环境:Hadoop 3.* Hive 3.* MySQL 8 ,如果还未安装相关环境,请参考:Hive 一文读懂 Centos7 安装Hadoop3 单机版本(伪分布式版本) SpringBoot 2 集成Hive 3 pom.xml <?xml ver…...

STL中优先队列的模拟实现与仿函数的介绍
文章目录 仿函数优先队列的模拟实现 仿函数 上回我们说到,优先队列的实现需要用到仿函数的特性 让我们再回到这里 这里我们发现他传入的用于比较的东西竟然是一个类模板,而不是我们所见到的函数 我们可以先创建一个类,用于比较大小 struc…...
LeetCode刷题--- 目标和
个人主页:元清加油_【C】,【C语言】,【数据结构与算法】-CSDN博客 个人专栏 力扣递归算法题 http://t.csdnimg.cn/yUl2I 【C】 http://t.csdnimg.cn/6AbpV 数据结构与算法 http://t.csdnimg.cn/hKh2l 前言:这个专栏主要讲述递归递归、搜…...
【.NET Core】反射(Reflection)详解(二)
【.NET Core】反射(Reflection)详解(二) 文章目录 【.NET Core】反射(Reflection)详解(二)一、概述二、Type类2.1 Type对象表示哪些类型2.2 获取Type及其关联对象类型的方式2.3 Type…...

【错误记录/js】保存octet-stream为文件后数据错乱
目录 说在前面场景解决方式其他 说在前面 后端:go、gin浏览器:Microsoft Edge 120.0.2210.77 (正式版本) (64 位) 场景 前端通过点击按钮来下载一些文件,但是文件内容是一些非文件形式存储的二进制数据。 后端代码 r : gin.Default()r.Stat…...
sql_lab之sqli中的post注入
Post注入 用burpsuit抓包去做 Post第一关:(gxa5) 1.判断是否存在注入 username1or 11 #&password123&submit%E7%99%BB%E5%BD%95 有回显 username1or 12 #&password123&submit%E7%99%BB%E5%BD%95 没有回显 则证明存在sq…...

智能优化算法应用:基于白冠鸡算法3D无线传感器网络(WSN)覆盖优化 - 附代码
智能优化算法应用:基于白冠鸡算法3D无线传感器网络(WSN)覆盖优化 - 附代码 文章目录 智能优化算法应用:基于白冠鸡算法3D无线传感器网络(WSN)覆盖优化 - 附代码1.无线传感网络节点模型2.覆盖数学模型及分析3.白冠鸡算法4.实验参数设定5.算法结果6.参考文…...

DETR++: Taming Your Multi-Scale Detection Transformer论文解读
文章目录 前言一、摘要二、引言三、相关研究四、模型方法1、Removing the Encoder方法2、Multi-Head方法3、Shifted Windows方法4、Bi-directional Feature Pyramid方法5、DETR方法 五、实验结果总结 前言 今天查看了一篇DETR论文,本想网络上找博客大概浏览一下&am…...

高级数据结构 <二叉搜索树>
本文已收录至《数据结构(C/C语言)》专栏! 作者:ARMCSKGT 目录 前言正文二叉搜索树的概念二叉搜索树的基本功能实现二叉搜索树的基本框架插入节点删除节点查找函数中序遍历函数析构函数和销毁函数(后序遍历销毁)拷贝构造和赋值重载(前序遍历创建)其他函数…...

蚂蚁集团5大开源项目获开放原子 “2023快速成长开源项目”
12月16日,在开放原子开源基金会主办的“2023开放原子开发者大会”上,蚂蚁集团主导开源的图数据库TuGraph、时序数据库CeresDB、隐私计算框架隐语SecretFlow、前端框架OpenSumi、数据域大模型开源框架DB-GPT入选“2023快速成长开源项目”。 (图…...

SpringBoot+JaywayJsonPath实现Json数据的DSL(按照指定节点表达式解析json获取指定数据)
场景 若依前后端分离版手把手教你本地搭建环境并运行项目: 若依前后端分离版手把手教你本地搭建环境并运行项目_前后端分离项目本地运行-CSDN博客 在上面搭建SpringBoot项目的基础上,并且在项目中引入fastjson、hutool等所需依赖后。 Jayway JsonPat…...

气压计LPS28DFW开发(2)----水压检测
气压计LPS28DFW开发.2--水压检测 概述视频教学样品申请完整代码下载水压计算设置速率和分辨率轮询读取数据测试结果 概述 本文将介绍如何使用 LPS28DFW 传感器来读取的压强数据,来估算水下深度,可以利用液体静压的原理。 最近在弄ST和瑞萨RA的课程&…...
设计模式之-装饰模式,快速掌握装饰模式,通俗易懂的讲解装饰模式以及它的使用场景
系列文章目录 设计模式之-6大设计原则简单易懂的理解以及它们的适用场景和代码示列 设计模式之-单列设计模式,5种单例设计模式使用场景以及它们的优缺点 设计模式之-3种常见的工厂模式简单工厂模式、工厂方法模式和抽象工厂模式,每一种模式的概念、使用…...
计算机网络个人小结
不同层的数据报的名称 应用层: data TCP层: segment IP 层: packet MAC层: frame MTU vs MSS: MTU:一个网络包的最大长度,以太网中一般为 1500 字节。 https://www.xiaolincoding.com/network/1_base/how_os_deal_network_package.html#linux-%E7%BD%91…...

Swift 协议扩展精进之路:解决 CoreData 托管实体子类的类型不匹配问题(下)
概述 在 Swift 开发语言中,各位秃头小码农们可以充分利用语法本身所带来的便利去劈荆斩棘。我们还可以恣意利用泛型、协议关联类型和协议扩展来进一步简化和优化我们复杂的代码需求。 不过,在涉及到多个子类派生于基类进行多态模拟的场景下,…...
Qt Widget类解析与代码注释
#include "widget.h" #include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget) {ui->setupUi(this); }Widget::~Widget() {delete ui; }//解释这串代码,写上注释 当然可以!这段代码是 Qt …...
蓝桥杯 2024 15届国赛 A组 儿童节快乐
P10576 [蓝桥杯 2024 国 A] 儿童节快乐 题目描述 五彩斑斓的气球在蓝天下悠然飘荡,轻快的音乐在耳边持续回荡,小朋友们手牵着手一同畅快欢笑。在这样一片安乐祥和的氛围下,六一来了。 今天是六一儿童节,小蓝老师为了让大家在节…...

MacOS下Homebrew国内镜像加速指南(2025最新国内镜像加速)
macos brew国内镜像加速方法 brew install 加速formula.jws.json下载慢加速 🍺 最新版brew安装慢到怀疑人生?别怕,教你轻松起飞! 最近Homebrew更新至最新版,每次执行 brew 命令时都会自动从官方地址 https://formulae.…...

脑机新手指南(七):OpenBCI_GUI:从环境搭建到数据可视化(上)
一、OpenBCI_GUI 项目概述 (一)项目背景与目标 OpenBCI 是一个开源的脑电信号采集硬件平台,其配套的 OpenBCI_GUI 则是专为该硬件设计的图形化界面工具。对于研究人员、开发者和学生而言,首次接触 OpenBCI 设备时,往…...
十九、【用户管理与权限 - 篇一】后端基础:用户列表与角色模型的初步构建
【用户管理与权限 - 篇一】后端基础:用户列表与角色模型的初步构建 前言准备工作第一部分:回顾 Django 内置的 `User` 模型第二部分:设计并创建 `Role` 和 `UserProfile` 模型第三部分:创建 Serializers第四部分:创建 ViewSets第五部分:注册 API 路由第六部分:后端初步测…...
小木的算法日记-多叉树的递归/层序遍历
🌲 从二叉树到森林:一文彻底搞懂多叉树遍历的艺术 🚀 引言 你好,未来的算法大神! 在数据结构的世界里,“树”无疑是最核心、最迷人的概念之一。我们中的大多数人都是从 二叉树 开始入门的,它…...

【免费数据】2005-2019年我国272个地级市的旅游竞争力多指标数据(33个指标)
旅游业是一个城市的重要产业构成。旅游竞争力是一个城市竞争力的重要构成部分。一个城市的旅游竞争力反映了其在旅游市场竞争中的比较优势。 今日我们分享的是2005-2019年我国272个地级市的旅游竞争力多指标数据!该数据集源自2025年4月发表于《地理学报》的论文成果…...

leetcode_69.x的平方根
题目如下 : 看到题 ,我们最原始的想法就是暴力解决: for(long long i 0;i<INT_MAX;i){if(i*ix){return i;}else if((i*i>x)&&((i-1)*(i-1)<x)){return i-1;}}我们直接开始遍历,我们是整数的平方根,所以我们分两…...

Appium下载安装配置保姆教程(图文详解)
目录 一、Appium软件介绍 1.特点 2.工作原理 3.应用场景 二、环境准备 安装 Node.js 安装 Appium 安装 JDK 安装 Android SDK 安装Python及依赖包 三、安装教程 1.Node.js安装 1.1.下载Node 1.2.安装程序 1.3.配置npm仓储和缓存 1.4. 配置环境 1.5.测试Node.j…...