c_character_string 字符串----我认真的弄明白了,也希望你们也是。
字符串
1. 字符串长度strlen
1.1strlen 函数介绍
size_t strlen ( const char * str );
strlen ——string length
strlen 的头文件是 #include <string.h>
参数指向的字符串必须要以 ‘\0’ 结束。
strlen 是求字符串长度的函数,统计的是字符串中\0之前出现的字符个数(不包含 ‘\0’ )。
注意函数的返回值为size_t,是无符号的。
示例1:
#include <stdio.h>
#include <string.h>
int main()
{char arr1[] = "abcdef";char arr2[] = { 'a','b','c','d','e','f' };char arr3[9] = { 'a','b','c','d','e','f' };printf("%d\n", strlen(arr1));printf("%d\n", strlen(arr2));printf("%d\n", strlen(arr3));return 0;
}打印:
6
12
6
arr1 是字符串,字符串的结束标志是 \0,所以 strlen 计算的是 \0之前出现的字符个数,所以是6。
arr2 是字符,arr2 里面没有 \0, 所以 strlen 计算的时候会一直往下计算直到遇到 \0 才会停下,是个随机值。
arr3 是字符串数组,数组数量为6个,所以才会打印6。
示例2:
#include <stdio.h>
#include <string.h>
int main()
{char arr1[] = "abc";char arr2[] = "abcdef";if (strlen(arr1) - strlen(arr2) > 0)printf(">\n");elseprintf("<\n");return 0;
}
运行结果:
大于strlen 计算出 arr1 的值是3,arr2 的值是6,arr1 - arr2 = -3 <0; 怎么会打印 > 呢?
因为函数的返回值为size_t,是无符号的。arr1 和 arr2 的返回值是无符号的,两个无符号的值相减的结果也是无符号的,即使结果是-3 也会被当成无符号数处理,一定会大于0,打印的结果就是 > 。
1.2 strlen 函数的模拟实现
方法一:计数器方式
#include <stdio.h>
#include <string.h>
size_t my_strlen(const char* str)
{int count = 0;while (*str){count++;str++;}return count;
}
int main()
{char arr[] = "abcdef";int len = my_strlen(arr);printf("%d\n", len);return 0;
}
方法二:指针-指针的方式
#include <stdio.h>
#include <string.h>
#include <assert.h>
size_t my_strlen(const char* str)
{assert(str);//确保str不为空指针const char* start = str;const char* end = str;while (*end != '\0'){end++;}return end - start;
}
int main()
{char arr[] = "abcdef";int len = my_strlen(arr);printf("%d\n", len);return 0;
}
方法三:不能创建临时变量计数器(递归求解)
#include <stdio.h>
#include <string.h>
size_t my_strlen(const char* str)
{if (*str == '\0')return 0;elsereturn 1 + my_strlen(str + 1);
}
int main()
{char arr[] = "abcdef";int len = my_strlen(arr);printf("%d\n", len);return 0;
}
2. 长度不受限制的字符串函数
长度不受限制的字符串和字符串长度没有关系,只关心\0
2.1 strcpy
2.1.1 strcpy 函数介绍
char *strcpy(char *dest, const char *src);
strcpy 的头文件是 #include <string.h>
源字符串必须以 ‘\0’ 结束。
strcpy 会将源字符串中的 ‘\0’ 拷贝到目标空间。
目标空间必须足够大,以确保能存放源字符串。
目标空间必须可变。注意:常量字符串不可以修改不可以放到目标空间里。
示例:
#include <stdio.h>
#include <string.h>
int main()
{char arr1[20] = { 0 };char arr2[] = "hello";strcpy(arr1, arr2);printf("%s\n", arr1);printf("%d\n", strlen(arr1));printf("%d\n", strlen(arr2));return 0;
}运行结果:
hello
5
5 //strcpy 会将源字符串中的 ‘\0’ 拷贝到目标空间。
2.1.2 strcpy 函数模拟实现
#include <stdio.h>
#include <string.h>
#include <assert.h>
char* my_strcpy(char* dest, const char* str)//str加const确保str不被修改
{assert(dest);assert(str);char* ret = dest;while (*dest++ = *str++){;}return ret;
}
int main()
{char arr1[20] = "abc";char arr2[] = "hello word";printf("%s\n", my_strcpy(arr1, arr2));return 0;
}运行结果:hello word
2.2 strcat
2.2.1 strcat 函数介绍
char *strcat(char *dest, const char *src)
strcat 字符串追加函数,头文件是 #include <string.h>,把源字符串追加到目标字符串,在目标字符串的\0后处开始追加,遇到源字符串的\0停止追加。追加的时候会把源字符串的\0一起追加到目标字符串。
源字符串必须以 ‘\0’ 结束。
目标空间必须有足够的大,能容纳下源字符串的内容。
目标空间必须可修改。
strcat 不可以自己追加自己,容易出现死循环。
示例:
#include <stdio.h>
#include <string.h>
int main()
{char arr1[20] = "hello \0xxxxxxxx";char arr2[] = "word";strcat(arr1, arr2);printf("%s\n", arr1);return 0;
}运行结果: hello word
2.2.2 strcat 函数模拟
#include <stdio.h>
#include <string.h>
char* my_strcat(char* dest, const char* str)
{//1.找目标空间中的\0char* cur = dest;while (*cur != '\0'){cur++;}//2.拷贝源头数据到\0之后的空间while (*cur++ = *str++) //*str++ 优先级都是一样的情况下,先右到左{;}return dest;
}
int main()
{char arr1[20] = "hello \0xxxxxxxx";char arr2[] = "word";printf("%s\n", my_strcat(arr1, arr2));return 0;
}运行结果:hello word
2.3 strcmp
2.3.1 strcmp 函数介绍
extern int strcmp(const char *s1,const char *s2);
strcmp 是比较字符串的库函数,头文件是 #include <string.h>,比较的是对应位置上字符的大小(ASCII码值的大小)而非长度
标准规定:
第一个字符串大于第二个字符串,则返回大于0的数字
第一个字符串等于第二个字符串,则返回0
第一个字符串小于第二个字符串,则返回小于0的数字
示例:
#include <stdio.h>
#include <string.h>
int main()
{/*char arr1[] = "abcdef";char arr2[] = "abc";*//*char arr1[] = "abc";char arr2[] = "abcd";*/char arr1[] = "abc";char arr2[] = "abc";int ret = strcmp(arr1, arr2);if (ret > 0)printf("arr1>arr2\n");else if (ret < 0)printf("arr1<arr2\n");elseprintf("arr1==arr2\n");printf("%d\n", ret);return 0;
}//运行结束://等于 ret = 0
2.3.2 strcmp 函数模拟实现
#include <stdio.h>
#include <string.h>
#include <assert.h>
//方法一
/*int my_strcmp(const char* s1, const char* s2)
{assert(s1 && s2);while (*s1 == s2){if (*s1 == '\0'){return 0;}*s1++;*s2++;}if (*s1 > *s2)return 1;elsereturn -1;
}*///方法二
int my_strcmp(const char* s1, const char* s2)
{assert(s1 && s2);while (*s1 == *s2){if (*s1 == '\0'){return 0;}s1++;s2++;}return *s1 - *s2;//返回两个字符ASCII相减的值
}int main()
{/*char arr1[] = "abcdef";char arr2[] = "abc";*/char arr1[] = "ad";char arr2[] = "aa";/*char arr1[] = "abc";char arr2[] = "abc";*/int ret = my_strcmp(arr1, arr2);if (ret > 0)printf("arr1>arr2\n");else if (ret < 0)printf("arr1<arr2\n");elseprintf("arr1==arr2\n");printf("%d\n", ret);return 0;
}//运行结果:arr1>arr23
3. 长度受限制的字符串函数介绍
3.1 strncpy 函数介绍
char *strncpy(char *destinin, char *source, int maxlen);
strncpy 的头文件是 #include <string.h>
拷贝num个字符从源字符串到目标空间。
如果源字符串的长度小于num,则拷贝完源字符串之后,在目标的后边追加NULL,直到num个
示例:
#include <stdio.h>
#include <string.h>
int main()
{char arr1[20] = "abcdefrtjujghbv";char arr2[] = "xxxx12";char arr3[] = "qwertyuio";strncpy(arr1, arr2, 7);printf("%s\n", arr1);strncpy(arr1, arr3, 3);printf("%s\n", arr1);return 0;
}//运行结果:xxxx12qwex12
3.2 strncat 函数介绍
char * strncat(char *dest, const char *src, size_t n);
strncat 的头文件是 #include <string.h>
strncat 和 strncpy 的使用非常相似,strncat是追加num个字符从源字符串到目标空间。
strncat 追加完成后会自己添加\0。
strncat 可以自己追加自己
示例:
#include <stdio.h>
#include <string.h>
int main()
{char arr1[20] = "abcdef";char arr2[] = "xyz";strncat(arr1, arr2, 2);printf("%s\n", arr1);strncat(arr2, arr2, 5);printf("%s\n", arr2);return 0;
}//运行结果:abcdefxyxyzxyz
3.3 strncmp 函数介绍
int strncmp(const char *str1, const char *str2, size_t n)
strmcpy 的头文件是 #include <string.h>
strncmp 比较到出现另个字符不一样或者一个字符串结束或者num个字符全部比较完。
如果返回值 < 0,则表示 str1 小于 str2。
如果返回值 > 0,则表示 str2 小于 str1。
如果返回值 = 0,则表示 str1 等于 str2。
示例:
#include <stdio.h>
#include <string.h>
int main()
{char arr1[20] = "abcdef";char arr2[] = "abd";int ret = strcmp(arr1, arr2, 3);printf("%d\n", ret);return 0;
}//运行结果:
-1
4. 字符串查找
4.1 strstr
4.1.1 strstr 函数介绍
char * strstr ( const char *str1, const char * str2);
strstr 字符串查找函数,头文件是 #include <string.h>,在一个字符串中查找另外一个字符串是否存在,如果存在,则返回子串第一次出现的位置;不存在,则返回NULL。
如果找到了该子串,会从找到的地方开始输出
示例:
#include <stdio.h>
#include <string.h>
int main()
{char arr1[] = "abcdefabcdef";char arr2[] = "def";char* p = strstr(arr1, arr2);if (p == NULL){printf("不存在\n");}else{printf("%s\n", p);}return 0;
}//运行结果:defabcdef
4.1.2 strstr函数模拟实现
#include <stdio.h>
#include <string.h>
char* my_strstr(const char* str1, const char* str2)
{const char* s1 = str1;const char* s2 = str2;const char* p = str1;while (*p){s1 = p;s2 = str2;while ((*s1 != '\0') && (*s2 != '\0') && (*s1 == *s2)){s1++;s2++;}if (*s2 == '\0'){return (char*)p;//找到了}p++;}return NULL;//找不到子串
}
int main()
{char arr1[] = "abcdefabcdef";char arr2[] = "fab";char* p = my_strstr(arr1, arr2);if (p == NULL){printf("不存在\n");}else{printf("%s\n", p);}return 0;
}//运行结果:fabcdef
4.2 strtok 函数介绍
char *strtok(char s[], const char *delim);
strtok 的头文件是 #include <string.h>
sep参数是个字符串,定义了用作分隔符的字符集合
第一个参数指定一个字符串,它包含了0个或者多个由sep字符串中一个或者多个分隔符分割的标记。
strtok函数找到str中的下一个标记,并将其用 \0 结尾,返回一个指向这个标记的指针。(注:strtok函数会改变被操作的字符串,所以在使用strtok函数切分的字符串一般都是临时拷贝的内容并且可修改。)
strtok函数的第一个参数不为 NULL ,函数将找到str中第一个标记,strtok函数将保存它在字符串中的位置。
strtok函数的第一个参数为 NULL ,函数将在同一个字符串中被保存的位置开始,查找下一个标记。
如果字符串中不存在更多的标记,则返回 NULL 指针。
示例:
#include <stdio.h>
#include <string.h>
int main()
{char arr[] = "zhangsan@qq.com";char buf[100] = { 0 };strcpy(buf, arr);//将数据拷贝一份,处理buf中arr数组的内容const char* sep = "@.o";//sep定义了用作分隔符的字符集合char* str = NULL;for (str = strtok(buf, sep); str != NULL; str = strtok(NULL, sep)){printf("%s\n", str);}return 0;
}//运行结果:zhangsanqqcm
5. 字符分类函数
后续添加
6. 字符串转换函数
int tolower ( int c );
int toupper ( int c );转换函数把字母大写转换成字母小写;或者把字母小写转换成字母大写。
tolower 函数返回其参数对应的小写形式
toupper 函数返回其参数对应的大写形式
如果函数的参数并不是处于适当大小写状态的字符(即 toupper 的参数不是小写字母或者 tolower 的参数不是大写字母),函数将不修改参数直接返回。
示例:
后续添加
7. 内存操作函数
7.1 memcpy
7.1.1 memcpy函数介绍
void * memcpy ( void * destination, const void * source, size_t num );memcpy 是内存拷贝函数,头文件是 #include <string.h>;num的单位是字节。
函数memcpy从source的位置开始向后复制num个字节的数据到destination的内存位置。
这个函数在遇到 ‘\0’ 的时候并不会停下来。
如果source和destination有任何的重叠,复制的结果都是未定义的。
memcpy 的参数类型是void*可以接收任意类型的数据。
示例:
#include <stdio.h>
#include <string.h>
int main()
{int arr1[10] = { 1,2,3,4,5,6,7,8,9,10 };int arr2[10] = { 0};memcpy(arr2, arr1, 20);//把arr1的前20个字节的数拷贝到arr2里面去,一个int是4字节int i = 0;for (i = 0; i < 10; i++){printf("%d ", arr2[i]);}return 0;
}//运行结果:1 2 3 4 5 0 0 0 0 0
7.1.2 memcpy 函数模拟实现
#include <stdio.h>
#include <string.h>
#include <assert.h>
void* my_memcpy(void* dest, void* src, size_t num)
{void* ret = dest;assert(dest);assert(src);//断言,让dest和src不为空指针while (num--){*(char*)dest = *(char*)src;//一个字节一个字节的处理dest = (char*)dest + 1;src = (char*)src + 1;}return ret;
}
int main()
{int arr1[10] = { 1,2,3,4,5,6,7,8,9,10 };int arr2[10] = { 0};my_memcpy(arr2, arr1, 20);//把arr1的前20个字节的数拷贝到arr2里面去int i = 0;for (i = 0; i < 10; i++){printf("%d ", arr2[i]);}return 0;
}//运行结果:1 2 3 4 5 0 0 0 0 0
7.2 memmove
7.2.1 memmove 函数介绍
void * memmove ( void * destination, const void * source, size_t num );memmove和memcpy的差别就是memmove函数处理的源内存块和目标内存块是可以重叠的。
memcpy 只需要实现不重叠的拷贝就可以了。
memmove 是需要实现重叠内存的拷贝。
如果源空间和目标空间出现重叠,就得使用memmove函数处理。
示例:
#include <stdio.h>
#include <string.h>
int main()
{int arr1[10] = { 1,2,3,4,5,6,7,8,9,10 };memmove(arr1+2, arr1, 20);int i = 0;for (i = 0; i < 10; i++){printf("%d ", arr1[i]);}return 0;
}//运行结束:1 2 1 2 3 4 5 8 9 10
7.2.2 函数模拟实现
#include <stdio.h>
#include <string.h>
#include <assert.h>
void* my_memmove(void* dest, void* src, size_t num)
{void* ret = dest;assert(dest);assert(src);//断言,让dest和src不为空指针if (dest < src)//1 前->后{while (num--){*(char*)dest = *(char*)src;//一个字节一个字节的处理dest = (char*)dest + 1;src = (char*)src + 1;}}else //2 3 后->前{while (num--){*((char*)dest + num) = *((char*)src + num);}}return ret;
}
int main()
{int arr1[10] = { 1,2,3,4,5,6,7,8,9,10 };my_memmove(arr1+2, arr1, 20);int i = 0;for (i = 0; i < 10; i++){printf("%d ", arr1[i]);}return 0;
}
7.3 memcmp 函数介绍
int memcmp(const void *str1, const void *str2, size_t n);memcmp 的头文件是 #include <string.h>
memcmp 比较从ptr1和ptr2指针开始的num个字节。一个字节一个字节比较。
str1-- 指向内存块的指针。
str2-- 指向内存块的指针。
n-- 要被比较的字节数。
strcmp是比较字符大小,这个是比较字节大小。
示例:
#include <stdio.h>
#include <string.h>
int main()
{int arr1[] = { 1,2,3,4,5 };//01 00 00 00 02 00 00 00 03 00 00 00 04 00 00 00 05 00 00 00...int arr2[] = { 1,2,3,0,0 };//01 00 00 00 02 00 00 00 03 00 00 00 00 00 00 00 00 00 00 00...int ret = memcmp(arr1, arr2, 13);printf("%d\n", ret);return 0;
}//运行结果:1
7.4 memset 函数介绍
void *memset(void *s, int ch, size_t n);memset 内存设置函数,头文件 #include <stdio.h>
将 ptr 设置为 value 值,num个字节。以字节为单位修改内存。
函数解释:将s中当前位置后面的n个字节 (typedef unsigned int size_t )用 ch 替换并返回 s 。
memset:作用是在一段内存块中填充某个给定的值,它是对较大的结构体或数组进行清零操作的一种最快方法 [1] 。
memset()函数原型是extern void *memset(void *buffer, int c, int count) buffer:为指针或是数组,c:是赋给buffer的值,count:是buffer的长度.
示例:
#include <stdio.h>
#include <string.h>
int main()
{int arr[5] = { 1,2,3,4,5 };memset(arr, 0, 9);int i = 0;for (i = 0; i < 5; i++){printf("%d ", arr[i]);}return 0;
}
7.4 memset 函数介绍
void *memset(void *s, int ch, size_t n);memset 内存设置函数,头文件 #include <stdio.h>
将 ptr 设置为 value 值,num个字节。以字节为单位修改内存。
函数解释:将s中当前位置后面的n个字节 (typedef unsigned int size_t )用 ch 替换并返回 s 。
memset:作用是在一段内存块中填充某个给定的值,它是对较大的结构体或数组进行清零操作的一种最快方法 [1] 。
memset()函数原型是extern void *memset(void *buffer, int c, int count) buffer:为指针或是数组,c:是赋给buffer的值,count:是buffer的长度.
示例:
#include <stdio.h>
#include <string.h>
int main()
{int arr[5] = { 1,2,3,4,5 };memset(arr, 0, 9);int i = 0;for (i = 0; i < 5; i++){printf("%d ", arr[i]);}return 0;
}相关文章:
c_character_string 字符串----我认真的弄明白了,也希望你们也是。
字符串 1. 字符串长度strlen 1.1strlen 函数介绍 size_t strlen ( const char * str );strlen ——string length strlen 的头文件是 #include <string.h> 参数指向的字符串必须要以 ‘\0’ 结束。 strlen 是求字符串长度的函数,统计的是字符串中\0之前出现…...
spring面试题 一
一、为了降低Java开发的复杂性,Spring采取了那4种关键策略 基于POJO的轻量级和最小侵入性编程; 通过依赖注入和面向接口实现松耦合; 基于切面和惯例进行声明式编程; 通过切面和模板减少样板式代码。 二、Spring框架的核心&am…...
C++中char *,char a[ ]的特殊应用
1.数组的本质 数组是多个元素的集合,在内存中分布在地址相连的单元中,所以可以通过其下标访问不同单元的元素。 2.指针 指针也是一种变量,只不过它的内存单元中保存的是一个标识其他位置的地址。 3.字符串常量的本质是它的第一个字符的地…...
【Windows10】电脑副屏无法调节屏幕亮度?解决方法
先说下情况,本人对显示器不太懂,属于小白 这个副屏无法调节的问题出现也已经很久了,但是之前亮度适合就无所谓,今天突然按了之后很亮,于是就找问题。 第一步,我直接百度,遇事不决,百…...
Paper简读 - ProGen2: Exploring the Boundaries of Protein Language Models
欢迎关注我的CSDN:https://spike.blog.csdn.net/ 本文地址:https://blog.csdn.net/caroline_wendy/article/details/128976102 ProGen2: Exploring the Boundaries of Protein Language Models ProGen2:探索蛋白质语言模型的边界Cumulative density:累积密度 Ligand:在生…...
leaflet 加载WKT数据(示例代码050)
第050个 点击查看专栏目录 本示例的目的是介绍演示如何在vue+leaflet中加载WKT文件,将图形显示在地图上。 直接复制下面的 vue+openlayers源代码,操作2分钟即可运行实现效果; 注意如果OpenStreetMap无法加载,请加载其他来练习 文章目录 示例效果配置方式示例源代码(共67行…...
设计模式-组合模式和建筑者模式详解
一. 组合模式 1. 背景 在现实生活中,存在很多“部分-整体”的关系,例如,大学中的部门与学院、总公司中的部门与分公司、学习用品中的书与书包、生活用品中的衣月艮与衣柜以及厨房中的锅碗瓢盆等。在软件开发中也是这样,例如&…...
Pcap文件的magic_number
1. 简述 pcap文件头中的magicNum是来标识pcap文件文件头和包头字节序和应用是否一致的。 在标准情况下为0xa1b2c3d4。如果相反则说明需要调换字节序。 一般格式 Global Header Packet Header Packet Data Packet Header Packet Data ....pcap文件头格式 typedef struct pca…...
MDS75-16-ASEMI三相整流模块MDS75-16
编辑-Z MDS75-16在MDS封装里采用的6个芯片,是一款工业焊机专用大功率整流模块。MDS75-16的浪涌电流Ifsm为920A,漏电流(Ir)为5mA,其工作时耐温度范围为-40~150摄氏度。MDS75-16采用GPP硅芯片材质,里面有6颗芯片组成。MDS75-16的电…...
基本TCP编程
1. 基本概念 TCP (即传输控制协议) 是一种面向连接的传输层协议,它能提供高可靠性通信 (即数据无误、数据无丢失、数据无失序、数据无重复到达的通信)。 2. 通信流程解析 TCP 通信的流程与打电话的过程相似,以下以一对情侣打电话的过程来展示TCP的通信流程: 其中服务端 …...
【沁恒WCH CH32V307V-R1开发板读取板载温度实验】
【沁恒WCH CH32V307V-R1开发板读取板载温度实验】1. 前言2. 软件配置2.1 安装MounRiver Studio3. ADC项目测试3.1 打开ADC工程3.2 编译项目4. 下载验证4.1 接线4.2 演示效果5. 小结1. 前言 ADC 模块包含 2 个 12 位的逐次逼近型的模拟数字转换器,最高 14MHz 的输入时…...
学习SpringCloudAlibaba(二)微服务的拆分与编写
目录 一、单体架构VS微服务架构 1.单体架构 (1).单体架构的优点 (2).单体架构的缺点 2.微服务架构 (1)微服务的特性 (2)微服务架构图 (3)微服务的优点 …...
通过对HashMap的源码分析解决部分关于HashMap的问题
HashMap第一次分配多大的空间我们查看resize()中的源码所以当我们没有传入默认容量的参数的时候,默认容量是16当传进一个20的初始参数时,数组的容量是多大所以当我们传入20的参数,这时创建的容量是32(2^5)对…...
【无标题】
Windeployqt 打包,缺少DLL 的原因分析,解决方法 很多同学使用工具windeployqt进行打包发布后,运行exe文件时,还是会出现下图所示的系统错误提示,这种情况就表示相关的DLL 库文件没有被正确打包。可是windeployqt明确显示运行正常啊,难道是QT自家的windeployqt这个工具有…...
渗透测试 -- 网站信息收集
数据来源 01 网站指纹识别 网站的最基本组成:服务器(操作系统)、中间件(web容器)、脚本语言(php、java、...)、数据库(Mysql、...)为什么要了解这些? 举个例子:发现了一…...
Windows 搭建ARM虚拟机 UOS系统
搭建环境安装虚拟机下载虚拟机QEMU,https://www.qemu.org/download/,目前最新版本是7.2.0。安装完成后,需要将qemu的安装路径设置到环境变量完成后运行cmd,测试环境变量配置完成。qemu-system-aarch64 --version如上截图所示&…...
day58每日温度_下一个更大元素1
力扣739.每日温度 题目链接:https://leetcode.cn/problems/daily-temperatures/ 思路 什么时候用单调栈呢? 通常是一维数组,要寻找任一个元素的右边或者左边第一个比自己大或者小的元素的位置,此时我们就要想到可以用单调栈了…...
超清遥感影像语义分割处理
分割出城市中的垃圾堆场,遂寻找到了 UrbanAtlas 2012 database 这个数据集和对应的 baseline baseline IoU for class 1: 0.5667 IoU for class 2: 0.3504 IoU for class 3: 0.0001 IoU for class 4: 0.0002 IoU for class 5: 0.4121 IoU for class 6: 0.0204 IoU for cla…...
RabbitMQ安装及配置
目录1.下载和安装1.1 下载1.2. 安装1.3 测试1.4 卸载管理界面2.1 添加用户2.2 创建Virtual Hosts2.3. 设置权限1.下载和安装 1.1 下载 1.下载Erlang的rpm包 RabbitMQ是Erlang语言编写,所以Erang环境必须要有,注:Erlang环境一定要与RabbitMQ…...
网络协议(四):网络互联模型、物理层、数据链路层
网络协议系列文章 网络协议(一):基本概念、计算机之间的连接方式 网络协议(二):MAC地址、IP地址、子网掩码、子网和超网 网络协议(三):路由器原理及数据包传输过程 网络协议(四):网络互联模型、物理层、数据链路层 目录一、网…...
AI Agent与Agentic AI:原理、应用、挑战与未来展望
文章目录 一、引言二、AI Agent与Agentic AI的兴起2.1 技术契机与生态成熟2.2 Agent的定义与特征2.3 Agent的发展历程 三、AI Agent的核心技术栈解密3.1 感知模块代码示例:使用Python和OpenCV进行图像识别 3.2 认知与决策模块代码示例:使用OpenAI GPT-3进…...
Springcloud:Eureka 高可用集群搭建实战(服务注册与发现的底层原理与避坑指南)
引言:为什么 Eureka 依然是存量系统的核心? 尽管 Nacos 等新注册中心崛起,但金融、电力等保守行业仍有大量系统运行在 Eureka 上。理解其高可用设计与自我保护机制,是保障分布式系统稳定的必修课。本文将手把手带你搭建生产级 Eur…...
Python爬虫(一):爬虫伪装
一、网站防爬机制概述 在当今互联网环境中,具有一定规模或盈利性质的网站几乎都实施了各种防爬措施。这些措施主要分为两大类: 身份验证机制:直接将未经授权的爬虫阻挡在外反爬技术体系:通过各种技术手段增加爬虫获取数据的难度…...
CMake 从 GitHub 下载第三方库并使用
有时我们希望直接使用 GitHub 上的开源库,而不想手动下载、编译和安装。 可以利用 CMake 提供的 FetchContent 模块来实现自动下载、构建和链接第三方库。 FetchContent 命令官方文档✅ 示例代码 我们将以 fmt 这个流行的格式化库为例,演示如何: 使用 FetchContent 从 GitH…...
华为云Flexus+DeepSeek征文|DeepSeek-V3/R1 商用服务开通全流程与本地部署搭建
华为云FlexusDeepSeek征文|DeepSeek-V3/R1 商用服务开通全流程与本地部署搭建 前言 如今大模型其性能出色,华为云 ModelArts Studio_MaaS大模型即服务平台华为云内置了大模型,能助力我们轻松驾驭 DeepSeek-V3/R1,本文中将分享如何…...
jmeter聚合报告中参数详解
sample、average、min、max、90%line、95%line,99%line、Error错误率、吞吐量Thoughput、KB/sec每秒传输的数据量 sample(样本数) 表示测试中发送的请求数量,即测试执行了多少次请求。 单位,以个或者次数表示。 示例:…...
【学习笔记】erase 删除顺序迭代器后迭代器失效的解决方案
目录 使用 erase 返回值继续迭代使用索引进行遍历 我们知道类似 vector 的顺序迭代器被删除后,迭代器会失效,因为顺序迭代器在内存中是连续存储的,元素删除后,后续元素会前移。 但一些场景中,我们又需要在执行删除操作…...
如何配置一个sql server使得其它用户可以通过excel odbc获取数据
要让其他用户通过 Excel 使用 ODBC 连接到 SQL Server 获取数据,你需要完成以下配置步骤: ✅ 一、在 SQL Server 端配置(服务器设置) 1. 启用 TCP/IP 协议 打开 “SQL Server 配置管理器”。导航到:SQL Server 网络配…...
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…...
PLC入门【4】基本指令2(SET RST)
04 基本指令2 PLC编程第四课基本指令(2) 1、运用上接课所学的基本指令完成个简单的实例编程。 2、学习SET--置位指令 3、RST--复位指令 打开软件(FX-TRN-BEG-C),从 文件 - 主画面,“B: 让我们学习基本的”- “B-3.控制优先程序”。 点击“梯形图编辑”…...
