字符串相关函数和文件操作
文章目录
- 1. C/C++ 字符串概述
- 1.1 字符串常量
- 1.2 字符数组
- 2. 字符串函数
- 2.1 拷贝赋值功能相关函数(覆盖)
- 2.1.1 strcpy
- 2.1.2 strncpy
- 2.1.3 memcpy
- 2.1.4 memmove
- 2.1.5 memset
- 2.1.6 注意小点
- 2.1.7 【函数区别】
- 2.2 追加功能相关函数
- 2.2.1 strcat
- 2.2.2 strncat
- 2.2.3 注意小点
- 2.3 比较功能相关函数
- 2.3.1 strcmp
- 2.3.2 strncmp
- 2.3.3 memcmp
- 2.3.4 注意小点
- 2.3.5 【函数区别】
- 2.4 找目标字符或者字符串功能相关函数
- 2.4.1 strchr
- 2.4.2 strrchr
- 2.4.3 memchr
- 2.4.4 strstr
- 2.4.5 注意小点
- 2.5 计算字符串长度函数
- 2.5.1 strlen
- 2.6 截取字符函数
- 2.6.1 strtok
- 3. 字符串相关函数例子
- 4. 文件操作
- 4.1 文件操作写入到数据文件中
- 4.2 文件操作读取数据到程序中
1. C/C++ 字符串概述
1.1 字符串常量
格式要求:
采用英文双引号包含的所有内容,C/C++ 语言规定,字符串常量都存在一个 ‘\0’ 结尾
特点:
字符串常量是常量,意味着它们在程序执行期间不能被修改。
在内存的【数据区】,在程序中存储字符串是存储的字符串所处内存的空间首地址,用
char *存储对应的首地址。"ABCDEFG" 占用字节为 8 个字节!!!
#include <stdio.h>
#include <stdlib.h>
#include <string.h>int main(int argc, char const *argv[])
{printf("字符串占用字节数: %ld\n", sizeof("ABCDEFG")); /*str 可以存储字符串常量在内存【数据区】的空间首地址同时也是当前字符串下标为 0 的元素空间首地址。*/char * str = "1234567890";printf("str : %s\n", str);printf("%p\n", "1234567890");printf("&str[5] : %s\n", &str[5]);printf("*str : %c\n", *str);printf("str[5] : %c\n", str[5]);printf("\"1234567890\"[5] : %c\n", "1234567890"[5]);return 0;
}
1.2 字符数组
格式要求:
字符数组是一组按顺序存储的字符,使用字符数组可以存储字符串。
例如:
char strArray[] = {'H', 'e', 'l', 'l', 'o', '\0'};或者char strArray[] = "Hello";。特点:字符数组是可变的,可以在程序执行期间修改其中的元素
#include <stdio.h>
#include <stdlib.h>
#include <string.h>int main(int argc, char const *argv[])
{char arr1[4] = {'a', 'b', 'c', '\0'};/*arr1 数组名数据类型为 char * 是当前字符数组空间首地址,同时也是数组中下标为 0 的元素空间首地址。可以将一个符合 C/C++ 规范的字符数组当做一个字符串【变量】操作。C/C++ 规范要求末尾必须有 \0*/printf("arr1 = %s\n", arr1);printf("arr1 = %p\n", arr1);printf("arr1[1] = %c\n", arr1[1]);arr1[1] = 'P';printf("arr1 = %s\n", arr1);char *str = "ABC";str[1] = 'p'; // 段错误!!!字符串常量无法修改printf("str = %s\n", str);return 0;
}
2. 字符串函数
【注意】
- 字符串是一个常量,数据内容无法修改,地址无法修改
- 字符串函数操作请注意【内存空间问题】
- 字符串函数,注意其返回值类型
2.1 拷贝赋值功能相关函数(覆盖)
2.1.1 strcpy
格式
char * strcpy(char * dest, const char * src)作用
将
src指向得字符串内容,拷贝到dest字符数据空间中。
2.1.2 strncpy
格式
char *strncpy(char *dest, const char *src, size_t n)作用
将
src指向得字符串内容,拷贝到dest字符数据空间中,最多复制n个字符
2.1.3 memcpy
格式
void *memcpy(void *dest, const void *src, size_t n)作用
从
src复制n个字符到dest中。
2.1.4 memmove
格式
void * memmove(void * dest, const void *src, size_t n)作用
从
src复制n个字符到dest的函数。
2.1.5 memset
格式
void * memset(void * str, int c, size_t n)作用
复制字符
c(一个无符号字符)到参数str所指向的字符串的前n个字符。
2.1.6 注意小点
src可以是字符串常量,也可以是字符数组dest必须是可以存储字符数据的内存空间,一般是字符数组或者动态申请内存字符空间,而且空间要求足够使用。- 返回值是
dest对应的空间地址。- 拷贝函数使用时,如果指定的
n个字节数不包含src字符串的最后一位'\0'时,需要手动添加'\0'来截断字符串,否则dest字符串会继续有后续的数据内容memcpy和memmove功能和strncpy一致,memmove可以更好的保护拷贝源数据src【墙裂推荐】使用memmove,不会导致内存数据丢失
2.1.7 【函数区别】
- 用途
memcmp: 通常用于比较两个内存区域的字节,不仅仅局限于字符串。strncmp: 主要用于比较字符串的前 n 个字符。- 参数:
memcmp: 接受三个参数,分别是两个内存区域的起始地址和要比较的字节数。strncmp: 接受三个参数,分别是两个字符串的起始地址和要比较的字符数。- 返回值:
memcmp: 返回一个整数,如果两个内存区域相等,则返回0;如果第一个不等于第二个,返回第一个不等于第二个的字节的差值。strncmp: 返回一个整数,如果两个字符串相等,则返回0;如果第一个不等于第二个,返回第一个不等于第二个字符的 ASCII 码差值。- 比较方式:
memcmp: 按字节比较,不考虑字符的含义。strncmp: 按字符比较,可以根据字符的字典序进行比较。- 比较长度:
memcmp: 需要明确指定要比较的字节数,没有考虑字符串的长度。strncmp: 需要明确指定要比较的字符数,但会在达到指定字符数或遇到字符串结束符 ‘\0’ 时停止比较。
strcnpy用于复制字符串,但相比于strcpy, 它可以指定要复制的最大字符数,避免缓冲区溢出。他会复制指定数量字符,或者直到遇到字符串结束符'\0'memcpy用于复制任何内存块的内容,不局限于字符串- 字符串结束符
strncpy会在达到指定的复制字符数或遇到src字符串的结束符'\0'时停止memcpy不关心内存块中是否包含结束符,它只是简单地按字节进行复制- 补零操作
strncpy在达到指定的字符数之前,如果遇到src字符串的结束符,会用零填充剩余空间,以确保目标字符串总长度为指定值memcpy不会自动在目标内存块的末尾添加零使用场景取决于需求。如果需要比较两个字节数组,不考虑其是否为字符串,使用
memcmp。如果明确在比较字符串,且希望控制比较的字符数,使用strncmp。
2.2 追加功能相关函数
2.2.1 strcat
格式
char * strcat(char * dest, const char * src)作用
把
src所指向的字符串追加到dest所指向的字符串的结尾
2.2.2 strncat
格式
char * strncat(char * dest, const char * src, size_t n)作用
把
src所指向的字符串追加到dest所指向的字符串结尾,直到n字符长度或者'\0'为止、
2.2.3 注意小点
- 字符串末尾标记
'\0'- 返回值数据类型为
char *,返回内容是dest对应的空间地址dest必须有对应内存空间- 返回值是
dest对应的空间地址。
2.3 比较功能相关函数
2.3.1 strcmp
格式
int strcmp(const char * str1, const char * str2)作用
把
str1所指向的字符串和str2所指向的字符串进行比较。
2.3.2 strncmp
格式
int strncmp(const char * str1, const char * str2, size_t n)作用
把
str1和str2进行比较,最多比较的是前n个字符。
2.3.3 memcmp
格式
int memcmp(const void * str1, const void * str2, size_t n)作用
把
str1和str2的前n个字节进行比较。
2.3.4 注意小点
- 如果返回值 < 0,则表示 str1 小于 str2。
- 如果返回值 > 0,则表示 str1 大于 str2。
- 如果返回值 = 0,则表示 str1 等于 str2。
- memcmp 使用时比较的是字节
2.3.5 【函数区别】
- 用途:
memcmp: 通常用于比较两个内存区域的字节,不仅仅局限于字符串。strncmp: 主要用于比较字符串的前 n 个字符。- 参数:
memcmp: 接受三个参数,分别是两个内存区域的起始地址和要比较的字节数。strncmp: 接受三个参数,分别是两个字符串的起始地址和要比较的字符数。- 返回值:
memcmp: 返回一个整数,如果两个内存区域相等,则返回0;如果第一个不等于第二个,返回第一个不等于第二个的字节的差值。strncmp: 返回一个整数,如果两个字符串相等,则返回0;如果第一个不等于第二个,返回第一个不等于第二个字符的 ASCII 码差值。- 比较方式:
memcmp: 按字节比较,不考虑字符的含义。strncmp: 按字符比较。- 比较长度:
memcmp: 需要明确指定要比较的字节数,没有考虑字符串的长度。strncmp: 需要明确指定要比较的字符数,但会在达到指定字符数或遇到字符串结束符 ‘\0’ 时停止比较。使用场景取决于需求。如果需要比较两个字节数组,不考虑其是否为字符串,更倾向于使用
memcmp。如果明确在比较字符串,且希望控制比较的字符数,更倾向于使用strncmp。
2.4 找目标字符或者字符串功能相关函数
2.4.1 strchr
格式
char * strchr(const char * str, int c)作用
在参数 str 所指向的字符串中搜索第一次出现字符 c(一个无符号字符)的位置。
2.4.2 strrchr
格式
char * strrchr(const char * str, int c)作用
在参数 str 所指向的字符串中搜索最后一次出现字符 c(一个无符号字符)的位置。
2.4.3 memchr
格式
void *memchr(const void * str, int c, size_t n)作用
在参数 str 所指向的字符串的前 n 个字节中搜索第一次出现字符 c(一个无符号字符)的位置。
2.4.4 strstr
格式
char * strstr(const char * haystack, const char * needle)作用
在字符串 haystack 中查找第一次出现字符串 needle(不包含空结束字符)的位置。
2.4.5 注意小点
strchrstrrchrstrstr函数成功找到时,返回一个目标字符c的位置的指针,如果未找到返回一个空指针NULL【扩展】在
C语言中,strchr函数的参数c被声明为int类型而不是char类型的原因与函数的设计和历史原因有关。
返回值的灵活性:
strchr函数的返回类型是
char *,即一个字符指针。返回指向字符的指针时,可以使用NULL表示未找到字符,而不使用一个特定的字符值(比如-1)。如果c被声明为char,则无法用NULL表示未找到。兼容性:
在
C语言的早期版本中,EOF被定义为-1,而不是char类型的字符。如果c被声明为char,则可能会导致类型不匹配的问题。将c声明为int可以确保与EOF的比较正常工作。字符扩展:
char类型在一些系统中可能是有符号的, 而在另一些系统中可能是无符号的。使用int可以确保适应所有字符,包括unsigned char的情况。虽然在实际使用中,通常将c视为字符,但将其声明为int是为了保证更好的兼容性和一致性。
2.5 计算字符串长度函数
2.5.1 strlen
格式
size_t strlen(const char * str)作用
计算字符串长度,直到空结束字符,但不包括空结束字符。
2.6 截取字符函数
2.6.1 strtok
格式
char *strtok(char *str, const char *delim)作用
分解字符串
str为一组字符串,delim为分隔符。
3. 字符串相关函数例子
#include <stdio.h>
#include <string.h>
#include <stdlib.h>int main(int argc, char const *argv[])
{// 字符串常量,字符串常量无法修改char *str = "1234567890";// 字符串打印printf("str : %s\n", str);// 字符串首地址printf("str : %p\n", str);// 从第五个字符开始打印 printf("&str[4] : %s\n", &str[4]); // &str[4] : 567890// 下标为 0 的字符printf(" *str : %c\n", *str); // *str : 1// 下标为 4 对应的字符printf("str[4] : %c\n", str[4]); // str[4] : 5// "1234567890"这个字符串中下标为 5 的字符printf("\"1234567890\"[5] : %c\n", "1234567890"[5]); // "1234567890"[5] : 6// 字符数组char arr[20] = {'a', 'b', 'c', '\0'};printf("---------------------\n");/*字符串拷贝函数格式:char *strcpy(char *dest, const char *src);将 src 指向的字符串内容,拷贝到 dest 字符数据空间中char *strncpy(char *dest, const char *src, size_t n);将 src 指向的字符串内容,拷贝到 dest 字符数据空间中,最多复制 n 个字符void * memcpy(void * dest, const void *src, size_t n);从 src 复制 n 个字符到 dest。void * memmove(void *dest, const void *src, size_t n);另一个用于从 src 复制 n 个字符到 dest 的函数。要求:1. src 可以是字符串常量,也可以是字符数组2. dest 必须是可以存储字符数据的内存空间,一般是字符数组或者动态申请内存字符空间,而且要求空间足够使用*/strcpy(arr, str);printf("arr = %s\n", arr); // 打印结果为 arr = 1234567890printf("---------------------\n");strncpy(arr, "abcd", 3);// strncpy 在使用时需要手动添加字符串结束符,以确保目标字符串的正确结束。// 加上 arr[3] = '\0';打印结果为 arr = abcprintf("arr = %s\n", arr); // arr = abc4567890printf("---------------------\n");char dest[30] = {'a', 'b', 'c', 'd', 'e', 'f', 'g', '\0'};memcpy(&dest[4], "1234", 6); // dest: abcd1234printf("dest: %s\n", dest);memmove(&dest[3], "*", 1);printf("dest: %s\n", dest); // dest: abc*1234printf("---------------------\n");/*字符串追加函数格式:char *strcat(char *dest, const char *src);把 src 所指向的字符串追加到 dest 所指向的字符串结尾char *strncat(char *dest, const char *src, size_t n);把 src 所指向的字符串追加到 dest 所指向的字符串结尾, 直到 n 字符长度为止或者到末尾标记 '\0'要求:1. 末尾标记'\0'2. 返回值数据类型为 char *,返回内容是 dest 对应的空间地址3. dest 必须有对应内存空间*/strcat(arr, "hjkl");printf("arr = %s\n", arr); // arr = abc4567890hjklprintf("---------------------\n");strncat(arr, "123", 8);printf("arr = %s\n", arr); // arr = abc4567890hjkl123printf("---------------------\n");/*字符串比较函数格式:int strcmp(const char *str1, const char * str2);把 str1 所指向的字符串和 str2 所指向的字符串进行比较。int strcmp(const char *str1, const char *str2, size_t n);把 str1 和 str2 进行比较,最多比较前 n 个字节。int memcmp(const void *str1, const void *str2, size_t n);把 str1 和 str2 的前 n 个字节进行比较。要求:1. 0 表示 str1 和 str2 两个字符串前 N 个字符一致 2. 1 or -1 表示两个字符串前 N 个字符不一致。*/char *str1 = "12345678";char *str2 = "1234567d";// 定义 bool 记录判断结果int bool = strcmp(str1, str2);printf("bool : %d\n", bool); // bool : -44bool = strncmp(str1, str2, 4);printf("bool : %d\n", bool); // bool : 0bool = memcmp(str1, str2, 5);printf("bool : %d\n", bool); // bool : 0printf("---------------------\n");/*字符串查找指定字符函数格式:char *strchr(const char *str, int c);在参数 str 所指向的字符串中搜索第一次出现字符 c(一个无符号字符)的位置。char *strrchr(const char *str, int c);在参数 str 所指向的字符串中搜索最后一次出现字符 c(一个无符号字符)的位置。char *strstr(const char*haystack, const char *needle);在字符串 haystack 中查找第一次出现字符串 needle(不包含空结束字符)的位置。void *memchr(const void *str, int c, size_t n);在参数 str 所指向的字符串的前 n 个字节中搜索第一次出现字符 c(一个无符号字符)的位置。*/char *p = strchr(str1, '2');printf("p : %s\n", p); // p : 2345678printf("---------------------\n");p = strrchr(str1, '4');printf("p : %s\n", p); // p : 45678printf("---------------------\n");p = strstr(str1, "34"); // str : 12345678printf("p : %s\n", p); // p : 345678p = strstr(str1, "789"); // str : 12345678printf("p : %s\n", p); // p : (null)printf("---------------------\n");p = memchr(str1, '5', 6);printf("p : %s\n", p); // p : 5678printf("---------------------\n");/*计算字符串长度格式:size_t strlen(const char *str);计算字符串 str 的长度,直到空结束字符,但不包括空结束字符。*/size_t length = strlen(str);printf("str : %s\n", str); // str : 1234567890printf("strlen: %ld\n", length); // strlen: 10return 0;
}
4. 文件操作
4.1 文件操作写入到数据文件中
#include <stdio.h>
#include <stdlib.h>
#include <string.h>int main(int argc, char const *argv[])
{ // 1. 确定文件路径char * filename = "./3.txt";/*2. fopen 打开文件,mode选择 w w+ a a+w 和 w+ 都是清空文件内容写入数据操作。如果文件不存在,可以创建文件a 和 a+ 是在当前文件的末尾写入数据操作如果文件不存在,可以创建文件*/ FILE * fp = fopen(filename, "a");// 3. 利用 fputc 写入数据到文件中fputc('A', fp);// 4. 关闭文件fclose(fp);return 0;
}
4.2 文件操作读取数据到程序中
#include <stdio.h>
#include <stdlib.h>
#include <string.h>int main(int argc, char const *argv[])
{// 1. 确定读取文件的路径char *filename = "./1.txt";/*2. 通过 fopen 打开文件,mode 选择 r r+ w+ a+*/FILE *fp = fopen(filename, "r");// 3. 通过 fgetc 读取数据int content = -1;while ((content = fgetc(fp)) != EOF){printf("%c\n", content);}// 4. 关闭文件fclose(fp);
}
相关文章:
字符串相关函数和文件操作
文章目录 1. C/C 字符串概述1.1 字符串常量1.2 字符数组 2. 字符串函数2.1 拷贝赋值功能相关函数(覆盖)2.1.1 strcpy2.1.2 strncpy2.1.3 memcpy2.1.4 memmove2.1.5 memset2.1.6 注意小点2.1.7 【函数区别】 2.2 追加功能相关函数2.2.1 strcat2.2.2 strnc…...
【c++学习】数据结构中的栈
c栈 栈代码用线性表实现栈用链表实现栈 栈 栈:先进后出 只对栈顶元素进行操作,包括新元素入栈、栈顶元素出栈和查看栈顶元素(只支持对栈顶的增、删、查)。 代码 下述代码实现了栈及其接口 包括对栈顶的增、删、查以及查看栈的大…...
新建react项目,react-router-dom配置路由,引入antd
提示:reactrouter6.4版本,与reactrouter5.0的版本用法有区别,互不兼容需注意 文章目录 前言一、创建项目二、新建文件并引入react-router-dom、antd三、配置路由跳转四、效果五、遇到的问题六、参考文档总结 前言 需求:新建react项…...
Transformer and Pretrain Language Models3-6
Pretrain Language Models预训练语言模型 content: language modeling(语言模型知识) pre-trained langue models(PLMs)(预训练的模型整体的一个分类) fine-tuning approaches GPT and BERT(…...
Linux系统中编写bash脚本进行mysql的数据同步
一、为何要用脚本做数据同步 (一)、问题 我们的视频监控平台云服务器,需要向上级的服务器定期同步一些数据表的数据,前期做了个程序,可以实现同步。但是,现在数据库的结构改了,结果又需要该程序…...
光耦驱动继电器电路图大全
光耦驱动继电器电路图(一) 注: 1U1-1脚可接12V,也可接5V,1U1导通,1Q1导通,1Q1-30V,线圈两端电压为11.7V. 1U1-1脚不接或接地,1U1不通,1Q1截止,1…...
【AI量化分析】小明在量化中使用交叉验证原理深度分析解读
进行交叉验证好处 提高模型的泛化能力:通过将数据集分成多个部分并使用其中的一部分数据进行模型训练,然后使用另一部分数据对模型进行测试,可以确保模型在未见过的数据上表现良好。这样可以降低模型过拟合或欠拟合的风险,提高模…...
2024最新版Visual Studio Code安装使用指南
2024最新版Visual Studio Code安装使用指南 Installation and Usage Guide for the Latest Visual Studio Code in 2024 By JacksonML Visual Studio Code最新版1.85已经于2023年11月由其官网 https://code.visualstudio.com正式发布,这是微软公司2024年发行的的最…...
接口请求重试八种方法
请求三方接口需要加入重试机制 一、循环重试 在请求接口的代码块中加入循环,如果请求失败则继续请求,直到请求成功或达到最大重试次数。 int retryTimes 3; for(int i 0;i < retryTimes;i){try{//请求接口的代码break;}catch(Exception e){//处理…...
【Linux 基础】常用基础指令(上)
文章目录 一、 创建新用户并设置密码二、ls指令ls指令基本概念ls指令的简写操作 三、pwd指令四、cd指令五、touch指令六、rm指令七、mkdir指令八、rmdir 指令 一、 创建新用户并设置密码 ls /home —— 查看存在多少用户 whoami —— 查看当前用户名 adduser 用户名 —— 创建新…...
【RT-DETR有效改进】EfficientFormerV2移动设备优化的视觉网络(附对比试验效果图)
前言 大家好,我是Snu77,这里是RT-DETR有效涨点专栏。 本专栏的内容为根据ultralytics版本的RT-DETR进行改进,内容持续更新,每周更新文章数量3-10篇。 专栏以ResNet18、ResNet50为基础修改版本,同时修改内容也支持Re…...
《动手学深度学习(PyTorch版)》笔记4.4
注:书中对代码的讲解并不详细,本文对很多细节做了详细注释。另外,书上的源代码是在Jupyter Notebook上运行的,较为分散,本文将代码集中起来,并加以完善,全部用vscode在python 3.9.18下测试通过。…...
Linux/Academy
Enumeration nmap 首先扫描目标端口对外开放情况 nmap -p- 10.10.10.215 -T4 发现对外开放了22,80,33060三个端口,端口详细信息如下 结果显示80端口运行着http,且给出了域名academy.htb,现将ip与域名写到/et/hosts中,然后从ht…...
windows .vscode的json文件配置 CMake 构建项目 调试窗口中文设置等
一、CMake 和 mingw64的安装和环境配置 二、tasks.json和launch.json文件配置 tasks.json {"version": "2.0.0","options": {"cwd": "${workspaceFolder}/build"},"tasks": [{"type": "shell&q…...
uniapp canvas做的刮刮乐解决蒙层能自定义图片
最近给湖南中烟做元春活动,一个月要开发4个小活动,这个是其中一个难度一般,最难的是一个类似鲤鱼跃龙门的小游戏,哎,真实为难我这个“拍黄片”的。下面是主要代码。 <canvas :style"{width:widthpx,height:hei…...
利用SPI,结合数据库连接池durid进行数据服务架构灵活设计
接着上一篇文章业务开始围绕原始凭证展开,而展开的基础无疑是围绕着科目展开的。首先我们业务层面以财政部的小企业会计准则的一级科目引入软件中。下面我们来考虑如何将科目切入软件更加灵活,方便业务扩展、维护与升级。 SPI是首先想到的数据服务方式 为什么会想到它呢?首…...
自动驾驶的决策层逻辑
作者 / 阿宝 编辑 / 阿宝 出品 / 阿宝1990 自动驾驶意味着决策责任方的转移 我国2020至2025年将会是向高级自动驾驶跨越的关键5年。自动驾驶等级提高意味着对驾驶员参与度的需求降低,以L3级别为界,低级别自动驾驶环境监测主体和决策责任方仍保留于驾驶…...
排序算法——希尔排序算法详解
希尔排序算法详解 一. 引言1. 背景介绍1.1 数据排序的重要性1.2 希尔排序的由来 2. 排序算法的分类2.1 比较排序和非比较排序2.2 希尔排序的类型 二. 希尔排序基本概念1. 希尔排序的定义1.1 缩小增量排序1.2 插入排序的变种 2. 希尔排序的工作原理2.1 分组2.2 插入排序2.3 逐步…...
Docker 容器内运行 mysqldump 命令来导出 MySQL 数据库,自动化备份
备份容器数据库命令: docker exec 容器名称或ID mysqldump -u用户名 -p密码 数据库名称 > 导出文件.sql请替换以下占位符: 容器名称或ID:您的 MySQL 容器的名称或ID。用户名:您的 MySQL 用户名。密码:您的 MySQL …...
【Java万花筒】数字信号魔法:Java库的魅力解析
从傅立叶到矩阵:数字信号Java库全景剖析 前言 随着数字信号处理在科学、工程和数据分析领域的广泛应用,开发者对高效、灵活的工具的需求日益增长。本文旨在探讨几个与数字信号处理相关的Java库,通过介绍其特点、用途以及与已有库的关系&…...
基于FPGA的PID算法学习———实现PID比例控制算法
基于FPGA的PID算法学习 前言一、PID算法分析二、PID仿真分析1. PID代码2.PI代码3.P代码4.顶层5.测试文件6.仿真波形 总结 前言 学习内容:参考网站: PID算法控制 PID即:Proportional(比例)、Integral(积分&…...
Unity3D中Gfx.WaitForPresent优化方案
前言 在Unity中,Gfx.WaitForPresent占用CPU过高通常表示主线程在等待GPU完成渲染(即CPU被阻塞),这表明存在GPU瓶颈或垂直同步/帧率设置问题。以下是系统的优化方案: 对惹,这里有一个游戏开发交流小组&…...
MongoDB学习和应用(高效的非关系型数据库)
一丶 MongoDB简介 对于社交类软件的功能,我们需要对它的功能特点进行分析: 数据量会随着用户数增大而增大读多写少价值较低非好友看不到其动态信息地理位置的查询… 针对以上特点进行分析各大存储工具: mysql:关系型数据库&am…...
学校招生小程序源码介绍
基于ThinkPHPFastAdminUniApp开发的学校招生小程序源码,专为学校招生场景量身打造,功能实用且操作便捷。 从技术架构来看,ThinkPHP提供稳定可靠的后台服务,FastAdmin加速开发流程,UniApp则保障小程序在多端有良好的兼…...
爬虫基础学习day2
# 爬虫设计领域 工商:企查查、天眼查短视频:抖音、快手、西瓜 ---> 飞瓜电商:京东、淘宝、聚美优品、亚马逊 ---> 分析店铺经营决策标题、排名航空:抓取所有航空公司价格 ---> 去哪儿自媒体:采集自媒体数据进…...
使用 SymPy 进行向量和矩阵的高级操作
在科学计算和工程领域,向量和矩阵操作是解决问题的核心技能之一。Python 的 SymPy 库提供了强大的符号计算功能,能够高效地处理向量和矩阵的各种操作。本文将深入探讨如何使用 SymPy 进行向量和矩阵的创建、合并以及维度拓展等操作,并通过具体…...
Web 架构之 CDN 加速原理与落地实践
文章目录 一、思维导图二、正文内容(一)CDN 基础概念1. 定义2. 组成部分 (二)CDN 加速原理1. 请求路由2. 内容缓存3. 内容更新 (三)CDN 落地实践1. 选择 CDN 服务商2. 配置 CDN3. 集成到 Web 架构 …...
HDFS分布式存储 zookeeper
hadoop介绍 狭义上hadoop是指apache的一款开源软件 用java语言实现开源框架,允许使用简单的变成模型跨计算机对大型集群进行分布式处理(1.海量的数据存储 2.海量数据的计算)Hadoop核心组件 hdfs(分布式文件存储系统)&a…...
基于 TAPD 进行项目管理
起因 自己写了个小工具,仓库用的Github。之前在用markdown进行需求管理,现在随着功能的增加,感觉有点难以管理了,所以用TAPD这个工具进行需求、Bug管理。 操作流程 注册 TAPD,需要提供一个企业名新建一个项目&#…...
处理vxe-table 表尾数据是单独一个接口,表格tableData数据更新后,需要点击两下,表尾才是正确的
修改bug思路: 分别把 tabledata 和 表尾相关数据 console.log() 发现 更新数据先后顺序不对 settimeout延迟查询表格接口 ——测试可行 升级↑:async await 等接口返回后再开始下一个接口查询 ________________________________________________________…...
