【C语言】字符函数的易错点及其模拟实现
在上一章为大家简单介绍了字符函数的种类和基础运用,语法。那么在本章为大家分享一些易错点和自己如何编写一个自定义函数来实现相同的作用。(点个关注呗)
一·strlen:计算字符串长度
1. 函数原型
size_t strlen(const char *str);
2. 核心功能
-
计算从
str
指向地址到第一个'\0'
的字符数 -
不包含终止符
'\0'
本身
3. 使用示例
char s[] = "Hello";
printf("%zu", strlen(s)); // 输出5
4.易错点
-
未初始化指针:传入未初始化的指针导致段错误
-
非字符串参数:传入没有
'\0'
结尾的字符数组 -
修改const数据:错误使用非常量指针修改只读区字符串
-
格式化输出:在使用
printf
函数输出size_t
类型的值时,应使用%zu
格式说明符,而不是%d
或%u
。这是因为%zu
是专门为size_t
类型设计的格式说明符。 - 由于
strlen
的返回值是size_t
类型,这是一个无符号整数,因此在进行比较或算术运算时需要注意。例如,以下代码可能会导致意外的结果: -
if (strlen(x) - strlen(y) >= 0) {// 这个条件总是为真,因为 size_t 类型不可能是负数}
#include <stdio.h>
#include <string.h>
int main()
{char arr1[] = "abcdef";char arr2[] = "abcde";if (strlen(arr1) - strlen(arr2) > 0)//这里比较字符串的长度大小,无法直接比较,所以需要strlen函数。{printf("arr1>arr2\n");}else{printf("arr1 <= arr2\n");}return 0;
}
5.模拟实现
这里用递归的方法来实现。(还有计算器,指针-指针)
函数是求字符串的长度的,我们是从str指向的字符串中,统计\0之前的字符个数的
函数本身是不期望,修改str指向的字符串的
my_strlen("abcdef");
1 + my_strlen("bcdef")
1 + 1 + my_strlen("cdef")
1 + 1 + 1 + my_strlen("def")
1 + 1 + 1 + 1 + my_strlen("ef")
...
1 + 1 + 1 + 1 + 1 + 1 + my_strlen("");
a b c d e f 0
递归
#include <assert.h>size_t my_strlen(const char* str)
{assert(str != NULL);//断言输入的是正确的。if (*str == '\0')return 0;elsereturn 1 + my_strlen(str+1);
}int main()
{char arr[] = "abcdef";size_t len = my_strlen(arr);printf("%zu\n", len);return 0;
}
二.strcpy:字符串拷贝
1. 函数原型
char *strcpy(char *dest, const char *src);
2. 核心功能
-
将
src
指向的字符串(包含'\0'
)拷贝到dest
-
返回
dest
指针
3. 使用示例
char src[] = "Hello";
char dest[6];
strcpy(dest, src); // dest内容为"Hello\0"
4. 易错点
-
缓冲区溢出:目标数组空间不足
-
地址重叠:源与目标内存区域重叠导致未定义行为
-
忘记终止符:手动实现时漏拷贝
'\0'
5. 模拟实现
1.
char *my_strcpy(char *dest, const char *src){char *ret = dest;while((*dest++ = *src++)); // 包含'\0'的拷贝return ret;
}
2.
char* my_strcat( char* dest, char* src)
{//assret(dest != NULL);char* ret = dest;while (*dest++ = *src++)//1.数据的拷贝 2.拷贝完\0 循环停止{;// 这里是一个空语句}return ret;//返回的是目标空间的地址
}
int main()
{char e1[] = "qwerti";char e2[20] = "hhhhhhhhhhhh";my_strcat(e2, e1);printf("%s", e2);return 0;
}
三.strcat :字符串拼接
1. 函数原型
char *strcat(char *dest, const char *src);
2. 核心功能
-
将
src
字符串追加到dest
末尾(覆盖原'\0'
) -
返回
dest
指针
3. 使用示例
char str[20] = "Hello";
strcat(str, " World!"); // 结果:"Hello World!\0"
4. 易错点
-
缓冲区溢出:目标剩余空间不足,目标空间一定要大
-
未初始化目标:目标字符串没有正确初始化
-
多次拼接忘记重置:重复使用导致意外结果
5. 模拟实现
(*dest
等价于 *dest != '\0'
('\0'
的ASCII值为0,即逻辑假))
char* my_strcat(char* dest, const char* src)
{char* ret = dest;// 定位到dest结尾while (*dest) dest++;// 执行拷贝while ((*dest++ = *src++));//或者是//while(*dest++ = *src++)//{// ;// }return ret;
}
int main()
{char arr1[] = "hello";char arr2[] = "ge wei xiong di ";//stract(arr2, arr1);printf("%s",my_strcat(arr1, arr2));return 0;
}
四.strcmp:字符串比较
1. 函数原型
int strcmp(const char *s1, const char *s2);
2. 核心功能
按ASCII码值比较字符串内容
返回值:
<0:s1 < s2
=0:s1 == s2
>0:s1 > s2
3. 使用示例
printf("%d", strcmp("apple", "banana")); // 输出负数
4. 易错点
-
误解返回值:认为返回-1/0/1(负数表示小于,0表示等于,正数表示大于)
-
比较非字符串:参数未以
'\0'
结尾 -
忽略大小写:A(65)与a(97)会被认为不同
-
比较内容:不是比较字符串长短,而是字符对应的ASCLL值
5. 模拟实现
#include <assert.h>
int my_strcmp(const char* str1, const char* str2)
{assert(str1 && str2);while (*str1 == *str2){if (*str1 == '\0')return 0;//相等str1++;str2++;}if (*str1 > *str2)return 1; //大于elsereturn -1;//小于
}
int main()
{//abc\0//abc\0int r = my_strcmp("abcdef", "abq");if (r > 0)printf("abcdef > abq\n");else if(r == 0)printf("abcdef == abq\n");elseprintf("abcdef < abq\n");int w = my_strcmp("abr", "abq");if (w > 0)printf("abr > abq\n");else if (w == 0)printf("abr == abq\n");elseprintf("abr < abq\n");return 0;
}
通过这两个比较,可以清楚的理解比较的内容了吧。
五.对比总结表
函数 | 功能 | 关键点 | 风险点 | 时间复杂度 |
---|---|---|---|---|
strlen | 计算长度 | 不包含'\0' | 非字符串输入 | O(n) |
strcpy | 字符串拷贝 | 包含'\0'的完整拷贝 | 缓冲区溢出 | O(n) |
strcat | 字符串连接 | 覆盖原终止符 | 目标空间不足 | O(n+m) |
strcmp | 字符串比较 | ASCII值逐字符比较 | 误解返回值含义 | O(n) |
六.优化方案
一、字符串拷贝函数组
strcpy | char* strcpy(char* dest, const char* src) 完全拷贝src到dest(含'\0') |
strncpy | char* strncpy(char* dest, const char* src, size_t n) 最多拷贝n个字符 |
关键区别:
-
strncpy
不会自动添加终止符,需手动保证:char buf[10]; strncpy(buf, src, sizeof(buf)-1); buf[sizeof(buf)-1] = '\0'; // 强制终止
经典错误案例:
// 错误:缓冲区溢出 规定的大小为5,实际输入大于5 char dest[5]; strcpy(dest, "HelloWorld"); // 崩溃!// 错误:未终止字符串 无\0 char dest[10]; strncpy(dest, "Hello", 5); // dest内容为'H','e','l','l','o',?,?,?,?,?
二、字符串连接函数组
strcat | char* strcat(char* dest, const char* src) | 将src追加到dest末尾 |
strncat | char* strncat(char* dest, const char* src, size_t n) | 最多追加n个字符+自动补'\0' |
安全用法公式:
// 安全追加算法
size_t free_space = dest_size - strlen(dest) - 1; // 计算剩余可用空间
strncat(dest, src, free_space);
示例对比:
// 危险操作
char buf[10] = "Hello";
strcat(buf, "World!"); // 需要11字节空间(溢出)// 安全操作
char buf[10] = "Hello";
strncat(buf, "World!", sizeof(buf)-strlen(buf)-1); // 追加4字符+"\0"
三、字符串比较函数组
strcmp | int strcmp(const char* s1, const char* s2) | 比较到任意字符串出现'\0'为止 |
strncmp | int strncmp(const char* s1, const char* s2, size_t n) | 只比较前n个字符 |
七.结语
好嘞,本章就到此结束啦,感谢观看,代码不仅要多看,还要多敲。希望大家自己去实现一下模拟实现。
相关文章:
【C语言】字符函数的易错点及其模拟实现
在上一章为大家简单介绍了字符函数的种类和基础运用,语法。那么在本章为大家分享一些易错点和自己如何编写一个自定义函数来实现相同的作用。(点个关注呗) 一strlen:计算字符串长度 1. 函数原型 size_t strlen(const char *str…...
【前端】创建一个vue3+JavaScript项目流程
1、检查node和npm是否安装,查看版本: node -v npm -v 2、安装脚手架cli或vite (1)cli 安装:npm install -g vue/cli 检查是否安装成功:vue -v 使用cli创建项目:vue create my-project(项目名)--…...
JVM面试专题
目录 1 JVM组成 1.1 JVM由那些部分组成,运行流程是什么? 1.2 什么是程序计数器? 1.3 你能给我详细的介绍Java堆吗? 元空间(MetaSpace)介绍 1.4 什么是虚拟机栈 1.5 方法区 1.5.1 概述 1.5.2 常量池 1.5.3 运行时常量池 1.6 你听过…...
齐次线性方程组及python求解
齐次线性方程组的概念 齐次线性方程组是指所有常数项都为零的线性方程组,其一般形式为: a 11 x 1 a 12 x 2 ⋯ a 1 n x n 0 a_{11}x_1 a_{12}x_2 \cdots a_{1n}x_n 0 a11x1a12x2⋯a1nxn0 a 21 x 1 a 22 x 2 ⋯ a 2 n x n 0 a_…...
鸿蒙前后端项目源码-点餐v3.0-原创!原创!原创!
鸿蒙前后端点餐项目源码含文档ArkTS语言. 原创作品.我半个月写的原创作品,请尊重原创。 原创作品,盗版必究!!!! 原创作品,盗版必究!!!! 原创作…...
【数据结构】算法效率的双刃剑:时间复杂度与空间复杂度
前言 在算法的世界里,效率是衡量算法优劣的关键标准。今天,就让我们深入探讨算法效率的两个核心维度:时间复杂度和空间复杂度,帮助你在算法设计的道路上更进一步。 一、算法效率:衡量算法好坏的关键 算法的效率主要…...
Linux | I.MX6ULL 终结者底板原理图讲解(5)
01 USB 转串口电路 I.MX6ULL 终结者开发板板载了一个 USB 串口,原理图如图 1 和图 2 所示: USB 转串口我们使用的是 CH340G 芯片,该芯片是由南京沁恒微电子研发生产的一款国产芯片。CH340G的工作电压支持 3.3V、5V,甚至是 3V,从上图可以看到我们给 CH340G 的电压是 5V…...
java拆分字符串、去重并统计相关长度
java拆分字符串、去重并统计相关长度 20250331 19:52 求取逗号隔开的字符串的 的长度,要求去重。拆分字符串应该是指按照某种分隔符将字符串分割成多个部分,然后去除重复的部分,最后统计处理后各个部分的长度或者总长度。 这时候可能需要明确…...
Vue 2 和 Vue 3 有什么区别
Vue 2 和 Vue 3 是 Vue.js 框架的两个主要版本,它们在核心特性、性能、API 设计等方面有一些显著的区别。以下是它们的主要区别: 1. 核心特性 • Composition API: • Vue 3 引入了 Composition API,这是一种新的 API࿰…...
RabbitMQ、RocketMQ 和 Kafka 的消息特性对比
以下是 RabbitMQ、RocketMQ 和 Kafka 在保证消息不丢失、消息顺序、消息幂等性以及快速处理积压方面的详细对比: 1. 消息不丢失 特性RabbitMQRocketMQKafka生产者端开启事务或 Confirm 模式使用事务消息机制设置 acksall 确保消息被所有副本确认服务端消息持久化&…...
Logback 实现不同包的日志记录到不同文件
核心 通过合理配置多个 appender 来定义不同的日志输出目的地通过 logger 元素将不同的包与对应的 appender 关联起来同时利用 additivity 属性控制日志的传递,从而实现精准的日志输出管理。 additivity 属性控制日志传递: additivity 属性决定了该 l…...
【附JS、Python、C++题解】Leetcode面试150题(11)H指数
一、题目 274. H 指数 给你一个整数数组 citations ,其中 citations[i] 表示研究者的第 i 篇论文被引用的次数。计算并返回该研究者的 h 指数。 根据维基百科上 h 指数的定义:h 代表“高引用次数” ,一名科研人员的 h 指数 是指他…...
C++第13届蓝桥杯省b组习题笔记
1.九进制转十进制 九进制正整数 (2022)9转换成十进制等于多少? 第一位乘9的0次方,第二位乘9的1次方,第三位乘9的二次方以此类推 #include <iostream> using namespace std;int main() {// 请在此输入您的代码int t2022;int res0;int c…...
【学Rust写CAD】19 颜色渐变定义(gradient_stop.rs)
源码 //color/gradient_stop.rs use super::argb::Color; #[derive(Clone, Copy, Debug)] pub struct GradientStop {pub position: f32,pub color: Color, }代码分析 这段代码是一个结构体(struct),并为其派生(deriveÿ…...
从零开始跑通3DGS教程:介绍
写在前面 本文内容 本文所属《从零开始跑通3DGS教程》系列文章,将实现从原始图像(有序、无序)数据开始,经过处理(视频抽帧成有序),SFM,3DGS训练、编辑、渲染等步骤,完整地呈现从原始图像到新视角合成的全部流程&#x…...
探索 Python 编程的宇宙:从基础到进阶的奇妙之旅
在当今的编程世界里,Python 以其简洁、易读和强大的功能,成为了众多开发者的心头好。它就像一个充满无限可能的宇宙,吸引着人们不断去探索其中的奥秘。今天,让我们一起踏上这场 Python 编程的奇妙之旅,从基础到进阶&am…...
使用 Spring AI 和 LangChain4j 实现聊天机器人对比分析
人工智能领域正在彻底改变公司管理客户服务的方式。随着 Spring AI 和 LangChain4j 等专用框架的出现,Java 开发人员现在拥有强大的工具来实现能够从公司数据中学习的智能聊天机器人。在本文中,我们将探讨这两个框架的主要功能,并了解如何使用…...
3月31(信息差)
1.全国首个!湖北为脑机接口医疗服务定价 据湖北省医疗保障局消息,今日,湖北省医保局发布全国首个脑机接口医疗服务价格,其中,侵入式脑机接口植入费6552 元/次,侵入式脑机接口取出费3139元/次,非侵入式脑机接口适配费966元/次,标志着这一前沿科技正式步入民生领域,为无…...
苍穹外卖项目结构
苍穹外卖项目总结-CSDN博客 【苍穹外卖|项目】万字总结-CSDN博客 苍穹外卖项目总结_苍芎外卖如何实现的跨域-CSDN博客 【苍穹外卖 | 项目日记】第九天 万字总结-CSDN博客 【苍穹外卖|项目】万字总结-CSDN博客 一、技术点: Nginx代理 负载均衡:通过…...
3. 无重复字符的最长子串
leetcode Hot 100系列 文章目录 一、核心操作二、外层配合操作三、核心模式代码总结 一、核心操作 用map,key为char,value为出现次数,将字符串中的值依次入栈,再判断次数是否大于1,如果大于1,则循环删除掉…...
python力扣48.旋转图像
给定一个 n n 的二维矩阵 matrix 表示一个图像。请你将图像顺时针旋转 90 度。 你必须在 原地 旋转图像,这意味着你需要直接修改输入的二维矩阵。请不要 使用另一个矩阵来旋转图像。 示例 1: 输入:matrix [[1,2,3],[4,5,6],[7,8,9]] 输出&…...
文章配图新纪元:OpenAI新推出的GPT-4o原生图像生成功能启示
当OpenAI推出GPT-4o原生图像生成功能时,许多人惊呼:“AI生成的图像已经发展到这样了吗!”这一激动人心的时刻,标志着人工智能在图像创作领域迈出了历史性的一步。无论是细腻的人物肖像,栩栩如生的面部表情,…...
使用Google Gemini API密钥创建AI驱动的Chrome扩展程序
在这个快节奏的数字时代,我们高度依赖Chrome扩展程序来提升浏览效率。 但你是否想过用人工智能为你的扩展注入超能力?听起来很酷对吧?😎 随着谷歌Gemini API的发布,AI技术变得触手可及。 该API能让你在项目中直接调用先进的自然语言处理、图像识别等炫酷的AI功能。 更…...
MapReduce的工作原理
MapReduce 是 Hadoop 的核心计算框架,用于分布式处理大规模数据集。它的核心思想是 **"分而治之"**,将任务拆分为多个子任务并行处理,最终汇总结果。以下是其工作原理的详细解析 1. 核心阶段 MapReduce 的执行过程分为三个阶段&a…...
k8s网络策略
k8s网络策略 k8s网络测试概述查看防火墙策略 k8s网络策略网络访问控制案例:配置k8s网络策略结果验证 k8s网络策略配置示例 k8s网络测试概述 网络策略就是设置防火墙 查看防火墙策略 # 获取当前命名空间下的所有 NetworkPolicy 资源(网络策略࿰…...
Linux文件描述符的分配机制与重定向实现:揭开“一切皆文件”的面纱
Linux系列 文章目录 Linux系列前言一、Linux的标准流二、文件描述符分配规则三、文件重定向四、Linux下一切皆文件 前言 上篇我们介绍了语言和系统层次的基础I/O文件操作,其涉及的知识有:C语言文件操作和系统调用接口两者的关系、文件描述符的概念、操作…...
SpringBoot事务管理(四)
记录几条SpringBoot事务管理中踩过的坑及解决办法: 1. 自调用问题 问题描述 在同一个类中,一个非事务方法调用另一个有 Transactional 注解的事务方法,事务不会生效。因为 Spring 的事务管理是基于 AOP 代理实现的,自调用时不会…...
iOS GCD
GCD 任务队列 主队列: 任务在主线程执行,主队列是一个串行队列,它主要处理 UI 相关任务,也可以处理其他类型任务,但为了性能考虑,尽量让主队列执行 UI 相关或少量不耗时间和资源的操作。 系统全局并发队…...
Hadoop集群的常用命令
1.基本命令 启动 Hadoop: start-dfs.sh start-yarn.sh 这些命令会分别启动 Hadoop 的 DFS 和 YARN。 查看 Hadoop 目录: hdfs dfs -ls -R / 该命令会递归地列出 HDFS 根目录下的所有文件和目录。 创建目录: hdfs dfs -mkdir /example_dir 在 HDFS 中创建一个新目录。 上传文…...
Kafka 实战指南:原理剖析与高并发场景设计模式
一、介绍 Kafka是由 Apache 软件基金会开发的开源流处理平台,作为高吞吐量的分布式发布订阅消息系统,采用 Scala 和 Java 编写。 Kafka是一种消息服务(MQ),在理论上可以达到十万的并发。 代表的MQ软件—— kafka 十万…...
黑盒测试的判定表法(能对多条件依赖关系进行设计测试点)
定义: 判定表是分析和表达多逻辑条件下执行不同操作的工具。就是指把所有的输入条件、所有可能采取的动作按表格列出来,每一种条件和动作的组合构成一条规则,也即一条用例。 1.判定表法的引用 等价类边界值分析法主要关注单个输入类条件的测试并未考虑…...
SQLMesh系列教程:基于指标构建一致的分析语义层应用实践
本文深入探讨SQLMesh指标框架的核心概念、定义方法及应用场景。通过统一的语义层管理,SQLMesh解决了数据分析中指标定义不一致的痛点,实现了跨团队协作的数据一致性。文章包含指标定义语法详解、自动表连接机制解析、派生指标构建方法,并通过…...
解决Docker端口映射后外网无法访问的问题
一、前言 今天因为服务器宕机,重新启动后发现docker部署的mysql和redis都无法通过外网访问。经过排查原因是ip转发没有开启。下面教大家如何解决 二、问题排查 (1) 查看防火墙运行情况 使用firewall-cmd --state 如果防火墙处于not running,则可以排…...
如何指定运行amd64架构的ubuntu?
如何指定运行amd64架构的ubuntu 下面这个命令如何制定运行amd64架构的ubuntu? docker run -it -v $(pwd):/workspace ubuntu:20.04 bash这个命令已经非常接近正确运行一个基于 amd64 架构的 Ubuntu 容器了,但如果你想明确指定运行 amd64 架构的镜像&am…...
[MySQL]数据类型
数据类型 1.数据类型分类2.数值类型2.1 tinyint类型无符号类型举例 3.bit类型3.1 基本语法 4. 小数类型4.1 float语法4.2 decimal语法 5.字符串类型5.1 char类型5.2 varchar 6.日期类型7.enum和set查询语句 1.数据类型分类 接下来就对上面的四种类型进行介绍 2.数值类型 数值类…...
基于Python的Django框架的手机购物商城管理系统
标题:基于Python的Django框架的手机购物商城管理系统 内容:1.摘要 随着互联网的快速发展,手机购物逐渐成为人们日常生活中不可或缺的一部分。本研究的目的是开发一个基于Python的Django框架的手机购物商城管理系统,以提高购物商城的管理效率和用户体验。…...
大模型在2型糖尿病预测及围手术期管理中的应用研究
目录 一、引言 1.1 研究背景与意义 1.2 国内外研究现状 1.3 研究目的与创新点 二、大模型预测 2 型糖尿病的原理与方法 2.1 大模型概述 2.2 用于 2 型糖尿病预测的大模型类型 2.3 模型训练与数据来源 2.4 预测指标与算法 三、术前风险预测与评估 3.1 血糖控制情况预…...
JavaEE--多线程
一、认识线程 1. 什么是线程 线程(Thread)是计算机科学中的基本概念,指的是程序内部的一条执行路径。一个进程可以包含多个线程,每个线程共享进程的资源,包括内存空间、文件描述符等。线程可以同时执行多个任务&…...
自动化测试之等待方式
在自动化测试中,等待是一个重要的技术,用于处理页面加载、元素定位、元素状态改变等延迟问题。 等待能够确保在条件满足后再进行后续操作,提高自动化测试的稳定性以及可靠性。 等待方式:显示等待、隐式等待、线程睡眠 1. 显式等…...
git中用于生成commitId与其父commitId间的文件差异文件树
生成commitId与其父commitId间的文件差异文件树 #!/bin/bash # # 用于生成目标commitId与其父commitId间文件差异 # commit_id$1 # 输入目标commit的哈希值 old_dir"old_version" new_dir"new_version"# 创建目录 mkdir -p "$old_dir" "$…...
Ubuntu / Debian 创建快捷方式启动提权
简述 在 Linux 系统中,.desktop 文件是 桌面入口文件,用于在桌面环境(如 GNOME、KDE)中定义应用程序的启动方式、图标、名称等信息。当你执行 touch idea.desktop 时,实际上创建了一个空的 .desktop 文件(…...
VLA 论文精读(三)Diffusion Policy: Visuomotor Policy Learning via Action Diffusion
这篇笔记用来描述 2023年 发表在arxiv上的一篇有关VLA领域的论文,这篇笔记记录的是该论文 2024年03月的改版后。 写在最前面 为了方便你的阅读,以下几点的注意事项请务必了解: 该系列文章每个字都是我理解后自行翻译并写上去的,…...
ASP.NET Core 中实现 SSE 流式响应的简单例子
[HttpGet] public async Task<IActionResult> SseExample() {// 请求头Response.Headers.Add("Content-Type", "text/event-stream");Response.Headers.Add("Cache-Control", "no-cache");Response.Headers.Add("Connectio…...
「Unity3D」TMP_InputField关闭虚拟键盘后,再次打开虚拟键盘,此时无法回调onSelect的问题
TMP_InputField可以注册一个onSelect回调函数,在InputField选中的时候回调,但在虚拟键盘手动关闭或被返回取消的时候,此时再打开虚拟键盘时,就不会调用onSelect。 原因在于,虚拟键盘有三种关闭的操作方式:…...
手工排查后门木马的常用姿势
声明!本文章所有的工具分享仅仅只是供大家学习交流为主,切勿用于非法用途,如有任何触犯法律的行为,均与本人及团队无关!!! 1. 检查异常文件 (1)查找最近修改的文件 # 查…...
VRRP协议
基础概念 Master 路由器:“Master 路由器”在一个 VRRP 组中承担报文转发任务。在每一个 VRRP 组中,只有 Master 路由器才会响应针对虚拟 IP 地址的 ARP Request。Master 路由器会以一定的时间间隔周期性地发送 VRRP 报文,以便通知同一个 VRRP 组中的 B…...
【JavaEE】MyBatis 综合练习(图书管理系统)
目录 一、数据库表二、引入依赖:三、Model创建四、用户登录五、添加图书六、图书列表七、修改图书八、删除图书九、批量删除十、强制登录 图书管理系统 一、数据库表 我们使用两张表,一张用户表uset_test来记录登录的用户信息,一张图书表boo…...
ArkUI —— 组件导航
创建导航页 // src\main\ets\pages\Index.ets Entry Component struct Index {// 路由栈Provide(pathInfos) pathInfos: NavPathStack new NavPathStack()build() {Navigation(this.pathInfos) {}} }创建导航子页 this.navPath.pushPathByName(AccountTag, 账本分类管理)// …...
数据处理与机器学习入门
一、数据处理概述 数据处理是通过统计学、机器学习和数据挖掘方法从原始数据中提取有价值信息的过程。数据处理的目标是将杂乱无章的原始数据转化为可用于分析和建模的结构化数据。对于小规模数据处理,常用工具分为两类: • 可视化分析工具:…...
Markdown在线转word格式
1、打开网址 https://dillinger.io/ 2、输入markdown格式文章 3、直接转换为右边的word格式 4、复制粘贴即可。...