当前位置: 首页 > news >正文

【c语言】字符函数和字符串函数

目录

1.函数介绍

1.1 strlen

1.2 strcpy

 1.3 strcat

 1.4 strcmp

1.5 strncpy

1.6 strncat 

1.7 strncmp

1.8 strstr

1.9 strtok

 1.10 strerror

1.11 memcpy

1.12 memmove 

1.13 memset

​编辑

 1.14 memcmp


C语言中对字符和字符串的处理很是频繁,但是C语言本身是没有字符串类型的,字符串通常放在常量字符串中或者字符数组中。
字符串常量适用于那些对它不做修改的字符串函数。

1.函数介绍

字符串函数:

1.1 strlen

  1.  字符串以 '\0' 作为结束标志,strlen函数返回的是在字符串中 '\0' 前面出现的字符个数(不包含 '\0' )。
  2. strlen函数参数实际上是字符串首元素的地址
    #include <stdio.h>
    #include <string.h>
    int main() {const char* str = "abcdef";size_t len1 = strlen("abcdef");size_t len2 = strlen(str);printf("%d\n", len1);printf("%d\n", len2);return 0;
    }
  3. 注意函数的返回值为size_t,是无符号的( 易错 )
    #include <stdio.h>
    int main()
    {const char* str1 = "abcdef";const char* str2 = "bbb";//注意:两无符号整型的差也是无符号整型//-3补码:11111111111111111111111111111101// 作为无符号整型时是极大的数字//    3        -       6     =-3if (strlen(str2) - strlen(str1) > 0){printf("str2>str1\n");}else{printf("srt1>str2\n");}return 0;
    }
  4. 模拟实现strlen
    //1.计数器
    size_t my_strlen(char* str) {int count = 0;//创建了临时变量记录长度while (*str != '\0') {count++;str++;}return count;
    }
    int main() {char arr[] = "abc";size_t len = my_strlen(arr);//注意:数组名实际上是首元素的地址printf("%zd\n", len);return 0;
    }//使用assert断言以及const对计数器实现模拟strlen函数进行改造
    size_t my_strlen(const char* str) {//如果不写返回类型,编译器默认返回int型assert(str);//str不为空指针size_t count = 0;while (*str) {count++;str++;}return count;
    }
    int main() {char arr[] = "abcdef";printf("%zd\n", my_strlen(arr));return 0;
    }//2.递归
    size_t my_strlen(char* str) {if (*str == '\0') {return 0;}elsereturn 1 + my_strlen(str + 1);//注意:不能传参str++(先使用后++);最好不要使用带有副作用的参数:++str:str本身的值也会被改变
    }
    int main() {char arr[] = "abc";size_t len = my_strlen(arr);//注意:数组名实际上是首元素的地址printf("%zd\n", len);return 0;
    }//3.指针-指针
    #include <stdio.h>
    size_t my_strlen(char* str) {char* start = str;while (*str != '\0') {str++;}return str - start;
    }
    int main() {char arr[] = "abcdef";size_t len = my_strlen(arr);printf("%zd\n", len);return 0;
    }

1.2 strcpy

  1.  Copies the C string pointed by source into the array pointed by destination, including the terminating null character (and stopping at that point).
  2. 源字符串必须以 '\0' 结束。
  3. 会将源字符串中的 '\0' 拷贝到目标空间。
  4. 目标空间必须足够大,以确保能存放源字符串——程序员自己保证
  5. 目标空间必须可变。
    #include <stdio.h>
    #include <string.h>
    int main() {//目标空间必须可以修改char* dest = "abcdef";char* arr[] = "HELLO";strcpy(dest, arr);//error:发生访问冲突:常量字符串不能修改printf("%s\n", dest);return 0;
    }
  6. 模拟实现strcpy
    #include <stdio.h>
    #include <assert.h>
    char* my_strcpy(char* dest, char* src) {assert(dest != NULL);assert(src != NULL);char* ret = dest;while (*dest++ = *src++);return ret;
    }
    int main() {char arr1[10] = { 0 };char arr2[] = "hello c";printf("%s\n", my_strcpy(arr1, arr2));return 0;
    }

 1.3 strcat

strcat的使用:

  1. 找到arr1的末尾(\0)
  2. 再把arr2的内容追加到arr1后边 
  1. Appends a copy of the source string to the destination string. The terminating null character in destination is overwritten by the first character of source, and a null-character is included at the end of the new string formed by the concatenation of both in destination.
  2. 源字符串必须以 '\0' 结束。(保证能找到目标空间的末尾)
  3. 目标空间必须有足够的大,能容纳下源字符串的内容
    #include <stdio.h>
    #include <string.h>
    int main() {//char arr1[] = "abc";//errchar arr1[20] = "abc";char arr2[] = "def";strcat(arr1, arr2);printf("%s\n",arr1);return 0;
    }
    下标越界
  4. 目标空间必须可修改
  5. 模拟实现
    #include <assert.h>
    #include <stdio.h>
    //模拟实现strcat
    //strcat函数返回的是目标空间的起始地址
    char* my_strcat(char* dest, const char* src) {char* ret = dest;assert(dest && src);//1.找到目标空间的起始地址while (*dest != '\0') {dest++;}//2.数据追加//相当于strcpywhile (*dest++ == *src++);return ret;
    }
    int main() {char arr1[20] = "abc";char arr2[] = "def";my_strcat(arr1, arr2);printf("%s\n", arr1);return 0;
    }
  6. 字符串自己给自己追加,如何?

注意:给自己追加可能会覆盖源字符串的'\0',导致源字符串不以'\0'结尾,但是否覆盖取决于库函数的具体实现,c语言没有规定标准的库函数实现,所以尽量不要给自己追加

 1.4 strcmp

  1. This function starts comparing the first character of each string. If they are equal to each other, it continues with the following pairs until the characters differ or until a terminating null-character is reached.
  2. 标准规定:
  • 第一个字符串大于第二个字符串,则返回大于0的数字
  • 第一个字符串等于第二个字符串,则返回0
  • 第一个字符串小于第二个字符串,则返回小于0的数字

注意:模拟实现

#include <assert.h>
#include <stdio.h>
//strcmp的模拟实现
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;//VS环境下返回的数字是1,-1
}
//注意:可以改成
int my_strcmp(const char* str1,const char* str2) {//只比较不改变assert(str1 && str2);while (*str1 == *str2) {if (*str1 == '\0')return 0;str1++;str2++;}return *str1 - *str2;//返回值符合要求
}
int main() {char arr1[] = "abe";char arr2[] = "abd";//使用strcmp比较字符串大小if (my_strcmp(arr1, arr2) > 0) {printf(">\n");}else if (my_strcmp(arr1, arr2) < 0) {printf("<\n");}elseprintf("=\n");return 0;
}

长度不受限制的字符函数:strcpy,strcat,strcmp

长度受限制的字符函数: strncpy,strncat,strncmp(相对安全)

1.5 strncpy

  1. Copies the first num characters of source to destination. If the end of the source C string (which is signaled by a null-character) is found before num characters have been copied, destination is padded with zeros until a total of num characters have been written to it.
  2. 拷贝num个字符从源字符串到目标空间(只拷贝num个字符,不会自动补充'\0')
  3. 如果源字符串的长度小于num,则拷贝完源字符串之后,在目标的后边追加0,直到num个
    #include <string.h>
    int main() {char arr1[20] = "xxxxxxxxxxxxx";char arr2[] = "abc";strncpy(arr1, arr2, 6);return 0;
    }

1.6 strncat 

  1. Appends the first num characters of source to destination, plus a terminating null-character.注意:加上'\0'
    #include <string.h>
    int main() {char arr1[10] = "abc\0xxxx";char arr2[] = "eee";strncat(arr1, arr2, 2);return 0;
    }
  2. If the length of the C string in source is less than num, only the content up to the terminating null-character is copied.(如果源字符串的长度小于num,就按照源字符串的长度追加)

1.7 strncmp

比较到出现另个字符不一样或者一个字符串结束或者num个字符全部比较完。

1.8 strstr

在字符串中找字符串

strstr会返回str1中str2第一次出现的位置,如果str1中没有str2,就返回NULL 

strstr的使用:

#include <stdio.h>
#include <string.h>
int main() {char arr1[] = "abcdefg";char arr2[] = "def";char* ret = strstr(arr1, arr2);if (ret == NULL) printf("找不到\n");elseprintf("%s\n", ret);return 0;
}

 

strstr的模拟实现:

#include <assert.h>
#include <stdio.h>
//strstr的模拟实现
const char* my_strstr(const char* str1, const char* str2) {//创建匹配指针const char* cp;const char* s1;const char* s2;//空指针不能接引用assert(str1 && str2);if (*str2 == '\0') {return str1;}cp = str1;while (*cp) {s1 = cp;s2 = str2;//匹配的条件/*if (*s1 && *s2 && *s1 == *s2) {s1++;s2++;}*///注意:判断是否匹配应该是个循环,否则无论是否匹配cp都++// 正确的是cp++一次,判断整个字符串是否匹配,不相等时cp++,不相等是因为str2到末尾时返回cpwhile (*s1 && *s2 && *s1 == *s2) {s1++;s2++;}if (*s2 == '\0') {return cp;}cp++;}return NULL;
}
int main() {char arr1[] = "abbbcdef";char arr2[] = "bbc";const char* ret = my_strstr(arr1, arr2);if (ret == NULL) {printf("没有找到\n");}elseprintf("%s\n", ret);return 0;
}

注意:

  1. 创建用来遍历的指针
  2. 空指针不能解引用
  3. str2为空字符串的情况
  4. 指针的使命(作用)
  5. 循环的条件
  6. 判断匹配的条件(没有到字符串末尾且对应相等)
  7. 不匹配时的两种情况
  8. 函数的返回值

注意:上述strstr的模拟实现是一种暴力求解方式,更高效的算法:KMP

1.9 strtok

  1.  sep参数是个字符串,定义了用作分隔符的字符集合(相同的字符只需要出现一次,且没有顺序)
  2. 第一个参数指定一个字符串,它包含了0个或者多个由sep字符串中一个或者多个分隔符分割的标记。
  3. strtok函数找到str中的下一个标记,并将其用 \0 结尾,返回一个指向这个标记的指针。(注: strtok函数会改变被操作的字符串,所以在使用strtok函数切分的字符串一般都是临时拷贝的内容并且可修改。)
  4. strtok函数的第一个参数不为 NULL ,函数将找到str中第一个标记,strtok函数将保存它在字符串中的位置
  5. strtok函数的第一个参数为 NULL ,函数将在同一个字符串中被保存的位置开始,查找下一个标记。
  6. 如果字符串中不存在更多的标记,则返回 NULL 指针。
#include <stdio.h>
#include <string.h>
//strtok函数
int main() {char arr1[] = "haodanlu@yeah.net@hehe";char arr2[] = "234.4342.235";//IP地址,点分十进制char buf1[200] = { 0 };strcpy(buf1, arr1);//使用strtok时用的是源字符串的临时拷贝char buf2[200] = { 0 };strcpy(buf2, arr2);char* p1 = "@.";char* s = NULL;for (s = strtok(buf1, p1); s != NULL; s = strtok(NULL, p1)) {//haodanlu@yeah.net@heheprintf("%s\n", s);}//strtok只有第一次使用需要传非空指针,for循环的初始化部分只执行一次,将strtok的第一次调用放在初始化部分//strtok可以调用多次,但第一次调用和之后调用不一样char* p2 = ".";char* s = NULL;for (s = strtok(buf2, p2); s != NULL; s = strtok(NULL, p2)) {//234.4342.235printf("%s\n", s);}return 0;}

 1.10 strerror

strerror将错误码翻译为错误信息,返回错误信息的起始地址

(无论是使用库函数,还是在软件设计过程中发生错误时,都会产生错误码)

c语言中使用库函数的时候,如果发生错误,就会将错误码放在errno的变量中,errno是一个全局变量,可以直接使用

打开文件的例子
fopen以读的形式打开文件:如果文件存在,打开成功,如果文件不存在,打开失败 

#include <stdio.h>
#include <string,h>
int main() {FILE* pf = fopen("add.txt", "r");//以读的形式打开add.txtif (pf == NULL) {printf("打开文件失败,原因是:%s\n", strerror(errno));return 1;}elseprintf("打开文件成功\n");return 0;
}

注意:不要隐藏文件的扩展名

#include <stdio.h>
#include <string.h>
//perror 头文件stdio.h
// 直接打印错误信息所对应的错误码
// printf+strerror
// perror在打印的时候:自定义信息: xxxxxxxxxxxx(自定义信息:(空格)(错误码错对应的信息)
// 方便,但是功能单一,无法实现单纯的获得错误码,而是直接打印
int main() {FILE* pf = fopen("add.txt", "r");//以读的形式打开add.txtif (pf == NULL) {perror("打开文件失败");return 1;}elseprintf("打开文件成功\n");return 0;
}

 字符函数:

  1. 字符分类函数
  2. 字符转换函数 
字符分类函数
函数如果他的参数符合下列条件就返回真
iscntrl任何控制字符
isspace空白字符:空格‘’,换页‘R’,换行‘N’,回车‘V’,制表符‘N’或者垂直制表符‘V’
isdigit十进制数字 0~9
isxdigit十六进制数字,包括所有十进制数字,小写字母a~f,大写字母A~F
islower小写字母a~z
isupper大写字母A~Z
isalpha字母a~z或A~Z
isalnum字母或者数字,a~z,A~Z,0~9
ispunct标点符号,任何不属于数字或者字母的图形字符(可打印)
isgraph任何图形字符
isprint任何可打印字符,包括图形字符和空白字符

 eg:islower

#include <stdio.h>
#include <ctype.h>
//islower
int main() {int ret = islower('a');printf("%d\n", ret);return 0;
}

//islower
// 之前判断小写字母的方法
int main() {char ch = 'w';if (ch >= 'a' && ch <= 'z') {printf("是小写字母\n");}elseprintf("非小写\n");return 0;
}

可以写成:

int main() {char ch = 'A';if (islower(ch)) {printf("是小写字母\n");}elseprintf("非小写\n");return 0;
}

字符转换函数:

int tolower ( int c );
int toupper ( int c );
注意:参数与返回值的类型都是int,字符数据可以以ASCII码值形式存入int型中,但int型不能存入char中 

 练习:

#include <stdio.h>
#include <ctype.h>
int main() {//Test String.\nchar arr[] = "Test String.\n";char* p = arr;while (*p) {*p = tolower(*p);//注意:转换以后要赋值才能改变*p//注意:tolower只能处理大写字母,小写字母(其他)不做改变p++;}printf("%s", arr);return 0;
}

内存相关函数: 

1.11 memcpy

头文件:string.h

注意:参数的指针类型不为具体的类型, 可以接受任意类型

模拟实现memcpy:

#include <assert.h>
//模拟实现
//注意:memcpy可以操作多个类型,用void*接收;
void* my_memcpy(void* dest, const void* src, size_t sz) {assert(dest && src);void* ret = dest;while (sz--) {*(char*)dest = *(char*)src;dest = (char*)dest + 1;//强制类型转换是临时的src = (char*)src + 1;//注意两种写法://1./*(char*)dest++;(char*)src++;*///++的优先级高于强制类型转化,void*类型的指针不能直接进行+-操作,不正确//2./*++(char*)dest;++(char*)src;*///c++下无法编译}return ret;
}
int main() {int arr1[10] = { 0 };int arr2[] = { 1,2,3,4,5 };//把arr2中前5个整数的数据拷贝到arr1中my_memcpy(arr1, arr2, 20);return 0;
}

memcpy是否能拷贝数组的数据给自身?

注意:不重叠内存的拷贝,可以使用memcpy;重叠内存的拷贝,可以使用memmove

1.12 memmove 

#include <string.h>
int main() {int arr[] = { 1,2,3,4,5,6,7,8,9,10 };memmove(arr + 2, arr, 20);return 0;
}

事实上,VS环境下使用memcpy也可以实现重叠部分的拷贝:

 标准值规定,memcpy来实现按不重叠的内存拷贝(只需要达成60分),重叠的内存拷贝,有memmove来实现;但是,当前的VS2022这个环境中memcpy也能实现重叠,当前环境下的memcpy100分

 memmove的模拟实现:

注意:如果src与dest的重叠部分在src的前面,就从前往后拷贝;如果在src的后面,就从后往前拷贝;总之,重叠部分的数据要先拷贝,否则会被覆盖

 

可以有两种拷贝方法:

1.dest<src:从前往后;dest>src:从后往前

2.src<dest<(char*)src+sz:从后向前;else:从前向后

这里方法一更简单,使用该方法进行模拟:

#include <assert.h>
#include <stdio.h>
//memmove的模拟实现
void* my_memmove(void* dest, const void* src, size_t sz) {assert(dest && src);void* ret = dest;if (dest < src) {int i = 0;for (i = 0; i < sz; i++) {*(char*)src = *(char*)dest;src = (char*)src + 1;//注意:强制类型转换是临时的,下一次使用仍要强转dest = (char*)dest + 1;}}else {while (sz--) {*((char*)dest + sz) = *((char*)src + sz);}}return ret;
}
int main() {int arr[] = { 1,2,3,4,5,6,7,8,9,10 };my_memmove(arr + 2, arr, 20);int i = 0;for (i = 0; i < 10; i++) {printf("%d ", arr[i]);}return 0;
}

1.13 memset

 注意:memset是以字节为单位来设置内存

#include <string.h>
#include <stdio.h>
int main() {char arr[] = "hello haodan";memset(arr + 6, 'x', 3);printf("%s\n", arr);return 0;
}
#include <string.h>
int main() {int arr[10] = { 0 };memset(arr, 1, 40);//数组会变成10个1吗?//不会:memset以字节为单位设置内存,而不是以整型为单位设置//memset不能将元素变为全1,但是可以设置为全0(每个字节都为0)//memset更适合设置字符return 0;
}

 1.14 memcmp

以字节为单位比较 

#include <string.h>
#include <stdio.h>
int main() {int arr1[] = { 1,2,3,4,5 };//第13个字节:04int arr2[] = { 1,2,3,7 };//第13个字节:07int arr3[] = { 1,2,3,0x11223304 };//第13个字节:04printf("%d\n", memcmp(arr1, arr2, 13));//返回小于0的数字printf("%d\n", memcmp(arr1, arr3, 13));//返回0return 0;
}

 

相关文章:

【c语言】字符函数和字符串函数

目录 1.函数介绍 1.1 strlen 1.2 strcpy 1.3 strcat 1.4 strcmp 1.5 strncpy 1.6 strncat 1.7 strncmp 1.8 strstr 1.9 strtok 1.10 strerror 1.11 memcpy 1.12 memmove 1.13 memset ​编辑 1.14 memcmp C语言中对字符和字符串的处理很是频繁&#xff0c;但是C语言本身是没有…...

使用 MCP(模型上下文协议)和 Claude 在 Node.js 中构建聊天应用程序

大家好&#xff0c;这里是架构资源栈&#xff01;点击上方关注&#xff0c;添加“星标”&#xff0c;一起学习大厂前沿架构&#xff01; 使用 Node.js 中的 MCP&#xff08;模型上下文协议&#xff09;构建聊天应用程序 我最近开发了一个简单的聊天应用程序&#xff0c;允许 …...

B站Michale_ee——ESP32_IDF SDK——FreeRTOS_2 队列

一、通过队列传递三种类型数据&#xff08;整型、结构体、指针&#xff09; 1.队列简介 FreeRTOS中的队列本质就是一个先入先出的缓冲区&#xff08;FIFO&#xff0c;First Input First Output&#xff09; 2.API简介 &#xff08;1&#xff09;创建队列的API &#xff08…...

小米MiMo:7B模型逆袭AI大模型战场的技术密码

小米MiMo&#xff1a;7B模型逆袭AI大模型战场的技术密码 在大模型竞争愈发激烈的2025年4月30日&#xff0c;小米以一款名为 MiMo-7B 的开源模型强势突围&#xff0c;在数学推理与代码能力评测中表现亮眼&#xff0c;不仅与规模更大的模型正面对抗&#xff0c;甚至超越了 OpenA…...

Java关键字解析

Java关键字是编程语言中具有特殊含义的保留字&#xff0c;不能用作标识符&#xff08;如变量名、类名等&#xff09;。Java共有50多个关键字&#xff08;不同版本略有差异&#xff09;&#xff0c;下面我将分类详细介绍这些关键字及其使用方式。 一、数据类型相关关键字 1. 基…...

YOLOv8模型训练过程

一&#xff0c;conda环境的创建就略过了 先进行库工具安装 pip install ultralytics -i https://pypi.tuna.tsinghua.edu.cn/simple 二&#xff0c;在github上下载好模型&#xff0c;先预测一把 yolo predict modelyolov8n.pt sourceultralytics/assets/bus.jpg 如果无…...

1996-2022年全国31省ZF干预度数据/财政干预度数据(含原始数据+计算过程+结果)

1996-2022年全国31省ZF干预度数据/财政干预度数据&#xff08;含原始数据计算过程结果&#xff09; 1、时间&#xff1a;1996-2022年 2、来源&#xff1a;国家统计局和各省年鉴 3、指标&#xff1a;地方财政一般预算支出、地区生产总值&#xff08;GDP&#xff09;、ZF干预度…...

STM32移植U8G2

STM32 移植 U8G2 u8g2 &#xff08;Universal 8bit Graphics Library version2 的缩写&#xff09;是用于嵌入式设备的单色图形库&#xff0c;可以在单色屏幕中绘制 GUI。u8g2 内部附带了例如 SSD13xx&#xff0c;ST7xx 等很多 OLED&#xff0c;LCD 驱动。内置多种不同大小和风…...

26.电流信号的强抗干扰能力运用

电流信号强抗干扰能力运用 1. 电流型信号与电压型信号的传输抗干扰能力差异2. 电流型信号电路示例 1. 电流型信号与电压型信号的传输抗干扰能力差异 现场干扰以电场干扰为主&#xff0c;电压较高但是能量&#xff08;电流I&#xff09;较低。如果以能量信号作为传输媒介&#x…...

【 Node.js】 Node.js安装

下载 下载 | Node.js 中文网https://nodejs.cn/download/ 安装 双击安装包 点击Next 勾选使用许可协议&#xff0c;点击Next 选择安装位置 点击Next 点击Next 点击Install 点击Finish 完成安装 添加环境变量 编辑【系统变量】下的变量【Path】添加Node.js的安装路径--如果…...

经典算法 青蛙跳杯子

青蛙跳杯子 题目描述 桌子上有n行m列的杯子&#xff0c;每个杯子与相邻杯子之间的距离为1&#xff0c;已知青蛙的跳跃半径为d&#xff0c;青蛙现在在第一行第一列的杯子上&#xff0c;它跳到最后一行最后一列的杯子上&#xff0c;最少需要跳几次&#xff1f; 输入描述 输入…...

C语言-函数的递归和迭代

以下是我初学C语言的笔记记录&#xff0c;欢迎在评论区补充留言 一&#xff0c;函数的递归 大致有这么几个问题【我看完这堂课后&#xff0c;自己总结的几个问题】 * 问题 1&#xff0c;什么是函数的递归, 2&#xff0c;它是干什么用的&#xff0c;3&#xff0c;有什么条件吗…...

Linux安装部署Postgresql数据库

联网安装方案 Linux能在线安装依赖组件的前提下&#xff0c;可以快速安装部署PG数据库&#xff0c;安装过程使用root管理员帐号&#xff1a; 首先&#xff0c;使用如下命令自动下载Postgresql组件&#xff1a; # 在openEuler、Fedora或CentOS 8上&#xff0c;你可能会使用&a…...

学习与规划的融合Dyna-Q:python从零实现

&#x1f9e0; 向所有学习者致敬&#xff01; “学习不是装满一桶水&#xff0c;而是点燃一把火。” —— 叶芝 我的博客主页&#xff1a; https://lizheng.blog.csdn.net &#x1f310; 欢迎点击加入AI人工智能社区&#xff01; &#x1f680; 让我们一起努力&#xff0c;共创…...

电子病历高质量语料库构建方法与架构项目(环境聆听与自动化文档生成篇)

电子病历高质量语料库的构建是一个复杂而系统的工程,涉及数据收集、清洗、标注、验证等多个环节。在项目实施过程中,"环境聆听"和"自动化文档生成"是两个关键支撑要素,前者确保项目能够适应不断变化的技术和业务环境,后者则保障项目过程的可追溯性和知…...

LegalOne:本土与国际视野融合的法律评级,大湾区律师及律师事务所榜单申报启动

在广东这片法律服务发展的热土上&#xff0c;从1979年全国首家法律服务机构诞生&#xff0c;到如今培育出4700家律所与8.7万律师&#xff0c;法律行业始终蓬勃向前。随着粤港澳大湾区建设推进&#xff0c;法律服务市场迈向双向融合的国际化新阶段&#xff0c;众多优秀律所和律师…...

突破传统!TTRL如何开启大模型无监督强化学习新篇章?

在大语言模型&#xff08;LLMs&#xff09;蓬勃发展的时代&#xff0c;如何让模型在无明确标签数据下有效学习成为关键难题。本文提出的Test-Time Reinforcement Learning&#xff08;TTRL&#xff09;给出了创新解法。它利用多数投票估计奖励&#xff0c;实现LLMs自我进化&…...

什么是:云边端一体化架构

什么是云边端一体化架构 文章目录 什么是云边端一体化架构云、边、端云计算边缘计算终端设备 云边端一体化协同云边端一体化架构协同的流程云边端一体化架构协同的应用云边端一体化架构协同的价值云边端一体化架构协同未来发展趋势 云、边、端 云&#xff08;Cloud&#xff09…...

【2025域适应科研日报】

本笔记主要为了记录自己的科研日报&#xff0c;前段时间刚开始想写的初衷也是为了自己的思考不跑偏&#xff0c;但是有几天又没有坚持下来&#xff0c;看到一位学长的文章&#xff0c;发现这种形式还是很有必要的&#xff0c;所以自己也打算坚持记录下来&#xff0c;由于还正在…...

Linux从入门到精通:全面掌握基础命令与高效操作实战指南

引言 Linux 作为开发者、运维工程师及技术爱好者的核心工具&#xff0c;其命令行的高效性与灵活性无可替代。但对于新手而言&#xff0c;复杂的命令与文件结构往往令人困惑。本文基于官方文档与实践经验&#xff0c;系统梳理 Linux 基础命令、文件管理、目录操作、高级技巧 四大…...

如何提升个人的稳定性?

提升自我的稳定性是一个系统性工程&#xff0c;需要从内在认知、情绪管理、行为习惯到外在环境等多个维度进行优化。 以下是一些具体建议&#xff0c;帮助你逐步增强内心的稳定感&#xff1a; 一、内在认知调整 1. 建立清晰的自我认知 通过反思&#xff08;如写日记、冥想…...

电机常用易混淆概念说明(伺服、舵机、多轮)

1. 概述 基础动力需求 &#xff1a;普通电机&#xff08;如水泵、风扇&#xff09;。 高精度控制 &#xff1a;优先伺服系统或伺服电机&#xff08;如数控机床&#xff09;。 微型化场景 &#xff1a;舵机&#xff08;如遥控模型&#xff09;。 移动底盘 &#xff1a;单舵轮成…...

短视频矩阵系统:源码搭建与定制化开发的深度剖析

在短视频行业蓬勃发展的当下&#xff0c;越来越多的企业和个人希望构建自己的短视频矩阵系统。而在搭建过程中&#xff0c;源码搭建和定制化开发是两种常见的选择&#xff0c;它们各有优劣&#xff0c;适用于不同的需求场景。本文将从多个维度深入探讨两者的区别&#xff0c;为…...

8.进程概念(四)

一、环境变量 1.基本概念 环境变量(environment variables)⼀般是指在操作系统中用来指定操作系统运行环境的⼀些参数。 如&#xff1a;我们在编写C/C代码的时候&#xff0c;在链接的时候&#xff0c;从来不知道我们的所链接的动态静态库在哪里&#xff0c;但是照样可以链接成…...

Windows服务器提权实战:常见方法、场景与防御指南

在渗透测试中&#xff0c;​​权限提升&#xff08;提权&#xff09;​​是从低权限账户&#xff08;如IIS、Apache运行账户&#xff09;获取系统管理员&#xff08;如SYSTEM&#xff09;权限的关键步骤。本文将从实战角度解析Windows服务器提权的常见技术&#xff0c;并结合真…...

OpenGL-ES 学习(14) ----顶点指定和基本图元的绘制

目录 本节概述顶点的指定常量顶点属性和顶点数组顶点数组顶点属性的定义Shader 中声明顶点属性变量顶点属性的绑定 基本图元绘制基本图元三角形直线绘制图元的API 本节概述 绘制图形的第一步就是指定顶点坐标&#xff0c;可以每个顶点指定&#xff0c;也可以是用于所有顶点的常…...

spring-cloud-alibaba最新版本聚合项目创建

1. 创建聚合项目 修改 pom.xml spring-boot 当前最新版本是 3.4.5 但是 spring-cloud-alibaba 的最新版本是 2023.0.3.2&#xff0c;只适配到 spring-boot 3.2.4 还没有适配到 spring-boot 的 3.4.5 版本。 pom.xml 文件内容如下(可以直接复制)&#xff1a; <?xml vers…...

网络分析/

三、网络分析&#xff08;Network Analysis&#xff09; 网络分析用于解决路径规划、资源分配等问题&#xff0c;广泛应用于交通规划、物流配送、紧急救援等领域。ArcPy 提供了强大的网络分析工具&#xff0c;如 MakeNetworkDataset、Solve 等。 &#xff08;一&#xff09;使用…...

Flutter PIP 插件 ---- 新增PipActivity,Android 11以下支持自动进入PIP Mode

接上文 Flutter PIP 插件 ---- Android 项目地址 PIP&#xff0c; pub.dev也已经同步发布 pip 0.0.3&#xff0c;你的加星和点赞&#xff0c;将是我继续改进最大的动力 开发文档 Add videos using picture-in-picture (PiP)介绍PIP功能从 Android 8.0 (API level 26) 引入&…...

权限提升—Linux提权内核溢出漏洞辅助项目

前言 今天开启Linux提权的篇章&#xff0c;主要是讲一下Linux的内核漏洞提权&#xff0c;利用方式和Windows系统漏洞提权差不多&#xff0c;也是网上的项目扫一下&#xff0c;然后根据漏洞编号去找exp即可。 信息收集 首先要说一下Linux用户的权限划分。 系统用户&#xff…...

超稳定性理论

为了更好的理解后面如何利用超稳定性理论来设计MRACS&#xff0c;本篇先对超稳定性理论做一个介绍。 1、理论介绍 在超稳定性理论中&#xff0c;核心的系统结构如下&#xff1a; 其包含一个线性的前向回路 G ( s ) G(s) G(s)和一个非线性的反馈回路 φ ( v ) \varphi (v) φ…...

治理和管理的区别

治理&#xff08;Governance&#xff09;与管理&#xff08;Management&#xff09;是两个在组织和社会运行中经常被提及的概念&#xff0c;它们虽然在某些方面有相似之处&#xff0c;但在内涵、范围、主体和目标等方面存在显著的区别。以下是它们的主要区别&#xff1a; 一、…...

业务流程BPM能力框架体系及华为中兴流程变革案例P83(83页PPT)(文末有下载方式)

资料解读&#xff1a;《业务流程 BPM 能力框架体系及华为中兴流程变革案例》 详细资料请看本解读文章的最后内容。 该文档围绕业务流程管理&#xff08;BPM&#xff09;能力框架体系展开&#xff0c;先阐述其定义、驱动因素与能力框架&#xff0c;再详细介绍战略规划、流程治理…...

如何通过日志在本地调试LangChain编写的程序?

LangSmith可以记录LangChain程序对LLM的调用&#xff0c;但它需要登陆LangSmith网站才能看到。有什么办法在本地就能看到详细的信息&#xff0c;以方便调试LangChain编写的程序吗&#xff1f; 使用LangChain提供的set_debug(True) 在Python代码中只需要导入set_debug这个方法…...

UE实用地编插件Physical Layout Tool

免费插件 https://www.fab.com/zh-cn/listings/a7fb6fcf-596f-48e9-83cc-f584aea316b1 可以通过物理模拟批量放置物体 不用再一个个摆放了 装饰环境从未如此简单&#xff0c;您不必再考虑对齐物体。 物理地放置物体&#xff0c;移动它们&#xff0c;在移动或在地图上放置物体…...

传感器的精度,灵敏度等概念介绍

文章目录 &#x1f3d4;️ 海拔高度传感器的四个核心指标1. &#x1f3af; **精度&#xff08;Accuracy&#xff09;——“测得的高度准不准”**2. ⚡ **灵敏度&#xff08;Sensitivity&#xff09;——“高度微小变化有没有反应”**3. &#x1f50d; **分辨率&#xff08;Reso…...

前端八股 CSS 1

盒子模型 进行布局时将所有元素表示为一个个盒子box padding margin border content content&#xff1a;盒子内容 待显示的文本和图像 padding&#xff1a;内边距&#xff0c;内容和border之间的空间&#xff0c;不能为负数&#xff0c;受bkc影响 border:边框&#xff0c…...

Transformer架构的解耦重组现象

技术演进图谱与技术成熟度曲线 &#xff08;一&#xff09;架构创新范式迭代 1.1 Transformer架构的解耦重组现象 以2025年Opt模型为例&#xff0c;其通过引入强化学习微调模块实现了传统单层堆叠架构向"感知-推理分离"模式的转型。实验数据显示&#xff0c;该架构…...

【Android】四大组件

目录 1. Activity 2. Service 3. BroadcastReceiver 4. ContentProvider 四大组件各自承担着不同的职责&#xff0c;彼此之间协同工作&#xff0c;共同为用户提供一个流畅的APP体验。 1. Activity 负责展示用户界面&#xff0c;就像App的一个个“页面”&#xff0c;用户通…...

贪心算法精解(Java实现):从理论到实战

一、贪心算法概述 贪心算法&#xff08;Greedy Algorithm&#xff09;是一种在每一步选择中都采取当前状态下最优决策的算法策略。它通过局部最优选择来达到全局最优解&#xff0c;具有高效、简洁的特点。 核心特点&#xff1a; 局部最优选择&#xff1a;每一步都做出当前看…...

基于BERT类的MRPC语义相似度检测(从0到-1系列)

基于BERT类的MRPC语义相似度检测&#xff08;从0到-1系列&#xff09; 介绍 BERT&#xff08;Bidirectional Encoder Representations from Transformers&#xff09;是由Google开发的一种预训练模型&#xff0c;它是一种基于Transformer机制的深度双向模型&#xff0c;可以对…...

mysql-窗口函数一

目录 一、感受一下分组与窗口函数的区别 二、滑动窗口&#xff08;子窗口&#xff09;大小的确认 2.1 分组函数下order by使用 2.2 窗口子句 2.3 执行流程 三、函数使用 窗口函数需要mysql的版本大于等于8才行&#xff0c;可以先检查一下自己的mysql版本是多少 select ve…...

HashMap,高效 哈希

java HashMap 有独特的设计。 哈希表数组的每个位置是一个哈希桶&#xff0c;里面由链表或红黑树实现。&#xff08;> 8 或 < 6 的变化时&#xff0c;避免频繁切换&#xff09; 容量&#xff08;capacity&#xff09;&#xff1a; 哈希表中桶&#xff08;bucket&#xf…...

PyTorch入门------训练图像分类器

前言 1. 操作步骤 2. 数据集 一、公共部分 1.加载并归一化 CIFAR10 2.定义卷积神经网络 二、训练、保存模型参数部分 train_and_save.py 3.定义损失函数和优化器 4.训练网络(使用 CPU 或者 GPU) 5.保存训练好的模型参数 三、加载模型参数、模型推理部分 load_and_infer.py 6…...

DeepSeek V3 架构创新:大规模MoE与辅助损失移除

DeepSeek 团队推出的全新 DeepSeek V3 模型版本,相比之前的 V2 版本,V3 的参数量从两千多亿一跃攀升到 6710 亿,近乎实现了参数规模的三倍增长。如此宏大的模型规模并不只是简单地堆砌参数,而是建立在稀疏混合专家(Mixture-of-Experts,MoE)结构之上。得益于 MoE 的稀疏激…...

MCP 多工具协作链路设计:打造真正的智能工作流

目录 [TOC] &#x1f680; MCP 多工具协作链路设计&#xff1a;打造真正的智能工作流 &#x1f31f; 多工具协作链核心思想 &#x1f6e0;️ 设计示例&#xff1a;智能文档分析系统 &#x1f4d1; 1. MCP Server 定义多工具 list_txt_files.py read_file_content.py su…...

某修改版软件,已突破限制!

聊一聊 现在很多输入法都带有广告。 用着用着&#xff0c;不是提示升级就是弹出资讯。 特别是忙的时候&#xff0c;很影响心情。 今天给大家分享一款干净的输入法软件。 希望能你喜欢。 软件介绍 Q拼音输入法 工具我们下载后&#xff0c;进行安装。 双击打开&#xff0c…...

透视Linux内核:深度剖析Socket机制的本质

在Linux操作系统构建的网络世界里&#xff0c;Socket 宛如纵横交错的交通枢纽&#xff0c;承担着不同应用程序间数据往来的重任。无论是日常浏览网页时&#xff0c;浏览器与 Web 服务器间信息的快速交互&#xff1b;还是畅玩网络游戏过程中&#xff0c;玩家操作指令与游戏服务器…...

PostgreSQL数据表操作SQL

数据表操作 创建表 CREATE TABLE t_test(id SERIAL PRIMARY KEY,name varchar(30),birthday date);修改表名 ALTER TABLE t_test RENAME TO t_test1;添加列 ALTER TABLE t_test1 ADD COLUMN score numeric(5,2);删除列 ALTER TABLE t_test1 DROP COLUMN score;修改数据类型 AL…...

OpenAI最新发布的GPT-4.1系列模型,性能体验如何?

简单来说,这次GPT-4.1的核心思路就是:更实用、更懂开发者、更便宜!OpenAI这次没搞太多花里胡哨的概念,而是实实在在地提升了大家最关心的几个点:写代码、听指令、处理超长文本,而且知识库也更新到了2024年6月。 写代码。要说这次GPT-4.1最亮眼的地方,可能就是写代码这块…...