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

C语言: 字符串函数(下)

片头

在上一篇中,我们介绍了字符串函数。在这一篇章中,我们将继续学习字符串函数,准备好了吗?开始咯!

1.strncpy函数

1.1 strncpy函数的用法

strncpy是C语言中的一个字符串处理函数,它用于将一个字符串的一部分内容复制到另一个字符串中。

其函数原型为:

char *strncpy(char *dest, const char *src, size_t n);

其中,dest目标字符串的指针,src字符串的指针,n是要复制的字节数

该函数将源字符串src的前n个字符复制到目标字符串dest中,并返回目标字符串的指针。

需要注意的是,如果源字符串 src 的长度小于n,则复制完后目标字符串dest剩余的字节将填充为'\0',确保目标字符串以'\0'结尾。如果源字符串src的长度大于或等于n,则目标字符串dest可能不以'\0'结尾

这个函数常用于处理字符串截断或复制的情况,例如从一个字符串中复制一定长度的子串到另一个字符串中。

1.2 使用strncpy函数

当源字符串 src 的长度大于 n

#include<stdio.h>
#include<string.h>int main() {char dest[] = "##############";char src[20] = "little pig";            //从src中拷贝6个字符到dest中strncpy(dest, src, 6);printf("目标字符串为: %s\n", dest);return 0;
}

运行的结果为: 

目标字符串为:little########

当 src 字符串长度小于 n

#include<stdio.h>
#include<stdlib.h>int main() {char dest[100] = "##############";char src[12] = "little pig";strncpy(dest, src, 20);            //将src数组的前20个字符拷贝到dest中去printf("目标字符串为: %s\n", dest);return 0;
}

运行的结果为:

目标字符串为: little pig

1.3 strncpy的模拟实现

思路: 1. 拷贝num个字符从源字符串到目标空间

 2. 如果源字符串的长度小于num,则拷贝完源字符串之后,在目标字符串的后面追加'\0',直到num个

void my_strncpy(char arr1[], char arr2[], int num) {assert(arr1 && arr2);char* s1 = arr1;char* s2 = arr2;int len = strlen(arr2);if (len < num) {//如果源字符串的长度小于num,//则拷贝完源字符串之后,在目标的后面追加\0,直到num个while (num--) {if (*s2 != '\0') {*s1 = *s2;s1++;s2++;}else {*s1 = '\0';}}}else {//len > num ,根据num来拷贝while (num--) {*s1 = *s2;s1++;s2++;}}
}int main(){//strncpy函数char arr1[100] = "#########";char arr2[12] = "hello world";my_strncpy(arr1, arr2, 5);            //将arr2中5个字符拷贝到arr1中printf("arr1的字符串为: %s\n", arr1);return 0;}

 打印的结果为:

arr1的字符串为: hello####

还有一种方式可以实现:

void my_strncpy1(char arr1[], char arr2[],int num) {int i = 0;//下标i从0开始//当arr2[i]不等于'\0' 并且 下标 i < num时, 进入循环for (i = 0; arr2[i] != '\0' && i < num; i++) {//将arr2对应下标的元素赋值给arr1arr1[i] = arr2[i];}//src 中的'\0'有没有被拷贝if (i < num) {arr1[i] = '\0';}
}int main(){char arr1[100] = "#######";char arr2[12] = "hello world";my_strcpy1(arr1,arr2,20);        //将arr2中前20个字符拷贝到arr1中printf("arr1的字符串为: %s\n",arr1);return 0;
}

执行结果为:

 arr1的字符串为: hello world

还有另外一种解法,不过,都大同小异啦,思路差不多,上代码!

char* my_strncpy2(char arr1[], char arr2[], int num) {//断言 arr1 和 arr2 不是空指针,以确保它们是有效的地址assert(arr1 && arr2);//保存arr1的原始地址,以便稍后返回char* ret = arr1;char* s1 = arr1;char* s2 = arr2;//循环复制字符,直到遇到源字符串的结束符'\0',或者复制了num个字符while (*s2 && num) {*s1 = *s2;s1++;s2++;num--;		//每复制完一个字符,num自减一次}//如果num不为0,说明还有剩余的空间需要填充 NULL('\0')终止符if (num != 0) {while (num) {*s1 = '\0';s1++;num--;}}return ret;
}int main(){char arr1[100] = "AAAAAAAAAAA";char arr2[] = "bbq";char* S = my_strncpy2(arr1,arr2,20);printf("arr1中的字符串为: %s\n",arr1);return 0;
}

执行结果为:

arr1中的字符串为:  bbq


 2. strncat函数

2.1 strncat函数的用法

函数名strncat是"string concatenate"的缩写,是C语言中的字符串连接函数。它的作用是将一个字符串的前n个字符连接到另一个字符串的末尾。

函数的原型如下:

char* strncat(char* destination, const char* source, size_t n);

其中,destination目标字符串,source要连接的字符串,n是要连接的字符数

函数的执行过程是将source字符串前n个字符复制到destination字符串末尾,并在复制完成后在destination字符串的末尾添加一个字符串结束符'\0'。如果source字符串的长度小于n,则复制整个source字符串

函数的返回值是指向目标字符串的指针,即destination字符串的地址。

需要注意的是,strncat函数没有自动分配额外的空间来容纳连接后的字符串,因此在使用之前需要确保destination字符串有足够的空间来容纳连接后的结果。否则,可能会导致内存越界错误。

2.2 使用strncat函数

当src的字符串长度大于 n

#include<stdio.h>
#include<stdlib.h>int main() {char str1[20] = "happy";char str2[20] = "happy day";strncat(str1, str2, 5);            //将str2中的前5个字符拷贝到str1中printf("str1字符串的结果为: %s\n", str1);return 0;
}

执行结果为:

str1字符串的结果为: happyhappy 

当src的字符串长度小于等于 n

#include<stdio.h>
#include<stdlib.h>int main() {char str1[20] = "happy";char str2[20] = "happy day";strncat(str1, str2, 15);            //将str2字符串的前15个字符拷贝到str1中printf("str1字符串的结果为: %s\n", str1);return 0;
}

执行结果为:

str1字符串的结果为: happyhappy day 

2.3 strncat的模拟实现

思路: 循环遍历找到dest字符串数组的末尾,将src的前n个字符复制到dest字符串数组的后面,并更新dest字符串的长度

代码如下:

char* my_strncat(char arr1[], char arr2[],int num) {assert(arr1 && arr2);char* ret = arr1;	//保存arr1的原始地址,以便稍后返回char* s1 = arr1;char* s2 = arr2;int len = strlen(arr2);	//定义变量len,用来记录arr2的长度while (*s1 != '\0') {	//循环遍历找到arr1字符串的末尾s1++;}//s1所指向的位置 就是\0的位置
//source字符串的前n个字符复制到destination字符串的末尾,
//并在复制完成后在destination字符串的末尾添加一个字符串结束符'\0'
//如果source字符串的长度小于n,则复制整个source字符串if (len > num) {while (num--) {*s1 = *s2;s1++;s2++;}*s1 = '\0';}else {// len < num, 复制整个source字符串while (num--) {if (*s2 != '\0') {*s1 = *s2;s1++;s2++;}else {*s1 = '\0';}}}return ret;
}int main(){char arr1[100] = "ABCD";char arr2[] = "abcd";my_strncat(arr1, arr2, 20);    //将arr2的前20个字符拷贝到arr1中printf("arr1字符串数组为: %s\n", arr1);return 0;
}

执行结果如下:

 arr1字符串数组为: ABCDabcd

关于这个strncat函数,还有另外一种解法:

char* my_strncat1(char* dest, char* src, int n) {//将dest首地址保存在temp中char* temp = dest;//1. 找到dest的'\0'位置while (*dest != '\0') {dest++;}//dest所指向的位置 就是\0的位置int i = 0;//2. 开始拷贝for (i = 0; i < n && src[i] != '\0'; i++) {dest[i] = src[i];}//如果src字符串的长度小于n,则拷贝完src数组后,在后面补'\0'if (i < n) {dest[i] = '\0';}return temp;
}int main(){char arr1[100] = "ABCDEF";char arr2[] = "abcd";my_strncat1(arr1, arr2, 2);    //将arr2字符串数组的前2个元素拷贝到arr1中printf("arr1字符串为: %s\n", arr1);return 0;}

执行结果为:

 arr1字符串为: ABCDEFab

没看够? 还有一种方式可以实现哟!

代码如下:

char* my_strncat2(char* dest, char* src, int n) {char* ret = dest;	//将dest首地址存储在ret中assert(dest && src);//保证dest、src非空while (*dest != '\0') {dest++;			//找到dest结尾的'\0'}while (n && (*dest++ = *src++)) //把src里的字符一个个放入dest后{n--;						//跳出循环的条件}if (n == 0) {*dest = '\0';				//如果n<src}return ret;						//返回dest字符串的起始地址
}int main(){char arr1[100] = "ABCD";char arr2[] = "abcdefgh";my_strncat2(arr1, arr2, 6);    //将arr2字符串数组的前6个字符拷贝到arr1中printf("arr1字符串数组为: %s\n", arr1);return 0;
}

执行结果为:

arr1字符串数组为: ABCDabcdef 


 3. strncmp函数

3.1 strncmp函数的用法

strncmp是C语言中的一个字符串比较函数。它用于比较两个字符串的前n个字符是否相等。

函数原型如下:

int strncmp(const char* str1, const char* str2, size_t n);

 其中,参数的含义如下:

  • str1: 要比较的第一个字符串
  • str2: 要比较的第二个字符串
  • n : 要比较的字符数

函数返回值:

  • 若前n个字符相等,则返回0
  • 若 str1 小于 str2, 则返回负值
  • 若str1 大于 str2, 则返回正值

注意:

  • 如果要比较的字符数n大于两个字符串的长度,则比较的字符数会被限制为两个字符串的最小长度。
3.2 strncmp的使用
#include<stdio.h>
#include<string.h>int main() {char arr1[30] = "abcdefg";char arr2[30] = "abcdeee";char arr3[30] = "abcdfgh";int ret1 = strncmp(arr1, arr2, 4);    //比较arr1和arr2的第4个字符int ret2 = strncmp(arr1, arr2, 6);    //比较arr1和arr2的第6个字符int ret3 = strncmp(arr2, arr3, 5);    //比较arr2和arr3的第5个字符int ret4 = strncmp(arr1, arr3, 7);    //比较arr1和arr3的第7个字符printf("ret1 = %d\n", ret1);printf("ret2 = %d\n", ret2);printf("ret3 = %d\n", ret3);printf("ret4 = %d\n", ret4);return 0;
}

运行结果为:

ret1 = 0
ret2 = 1
ret3 = -1
ret4 = -1 

3.3  strncmp的模拟实现

思路: 逐个比较两个字符串的前n个字符的ASCII码值,直到遇到不同的字符、遇到空字符或比较完n个字符为止,根据比较结果返回相应的整数。

代码如下:

int my_strncmp(char arr1[], char arr2[], int num) {char* s1 = arr1;		//指针s1指向arr1char* s2 = arr2;		//指针s2指向arr2while (num--) {			//比较num次if (*s1 == *s2) {	//如果s1指向的元素和s2指向的元素相同s1++;			//s1指针向后移动一个字符s2++;			//s2指针向后移动一个字符}else {return *s1 - *s2;//如果s1指向的元素和s2指向的元素不相同,则返回ASCII码的差值}	}return 0;				//如果num的次数用完,//两个指针指向的元素相同,则返回0
}int main(){char arr1[] = "abcdefgA";char arr2[] = "abcdefga";int ret2 =  my_strncmp(arr1, arr2, 8);    //从前往后比较8个字符printf("%d\n", ret2);return 0;}

执行结果为:

-32

 为啥是-32呢? 因为'A'的ASCII码值为 65, 'a'的ASCII码值为 97, 65 - 97 = -32

关于这个函数,还有另外一种方法:

int my_strncmp1(char arr1[], char arr2[], int num) {assert(arr1 && arr2);char* s1 = arr1;char* s2 = arr2;//如果n为0,说明不需要比较任何字符,直接返回0//表示两个字符串的前0个字符是相同的if (num == 0) {return 0;}//循环条件中,*s1 == *s2 确保两个字符相同// *s1 确保 s1 没有到达字符串结束符// --num 确保已经比较了 num 个字符或 num 已经减到0while (*s1 == *s2 && *s1 && *s2 && --num){//如果两个字符相同且没有到达字符串的结束符,继续比较下一个字符s1++;s2++;}//返回的是两个字符的ASCII码差值return *s1 - *s2;
}int main(){char arr1[] = "abcdefgA";char arr2[] = "abcdefga";int ret3 =  my_strncmp1(arr1, arr2, 7);    //从前往后比较7个字符printf("%d\n", ret3);return 0;
}

执行结果:

0

为啥结果为0呢? 因为两个字符串的前7个字符的ASCII码值都相同,因此,结果为0。

还有另外一种思路,大致都差不多,我们一起来看看

int my_strncmp2(char arr1[], char arr2[], int num) {int i = 0;                //下标i从0开始,比较两个字符串char* s1 = arr1;          //指针s1指向arr1char* s2 = arr2;          //指针s2指向arr2//当 *s1 并且 *s2 不为'\0'//并且满足两个指针指向的元素相同,//还要满足下标i<要拷贝的长度numwhile (*s1 && *s2 && *s1 == *s2 && i < num){                                                                                s1++;s2++;i++;                  //如果字符相同,两个指针都往后走一步,i自增一次}if (i == num) {           //如果下标i已经等于num,说明从下标从 0 ~ num-1 的元素都相同return 0;		      //前n个字符相等,返回0}else {return *s1 - *s2;    
//如果i<num,说明遍历过程中,中间有字符不相同,那么返回两个字符ASCII码值相减的结果}
}int main(){char str1[] = "abcd";char str2[] = "abcD";int ret = my_strncmp2(str1,str2,4);        //从头到尾比较arr1和arr2的前4个字符printf("%d\n",ret);return 0;
}

。执行结果为:

32

'd'的ASCII码值为100,'D'的ASCII码值为68, ASCII码值相减的结果为: 100 - 68 = 32


4. strtok函数

4.1 strtok函数的用法

strtok函数是C语言中的字符串分割函数,用于将一个字符串按照指定的分隔符进行分割并返回分割后的子字符串。该函数可以帮助我们遍历一个字符串中的各个子串。

函数原型如下:

char* strtok(char* str, const char* sep);

其中,参数的意义如下:

str: 在第一次调用时,str是传入需要被切割字符串的首地址; 在后续调用时,str应置为NULL,以便strtok函数能够在之前的位置基础上继续查找下一个标记。

sep: 这是一个字符串,它定义了用作分隔符的字符集合。字符串中的每个字符都会被当作一个分隔符。 

工作原理:

1. strtok函数在str字符串中查找由sep字符串定义的分隔符。当找到分隔符时,strtok函数会将其替换为'\0'字符,从而结束当前子串。

2. strtok函数返回指向当前找到的子串的指针。这个子串是从str开始,到当前找到的分隔符(现在已经替换为'\0')结束的部分

3. 在第一次调用之后,strtok会保存其在str中的位置,以便后续调用时能够继续查找下一个子串。因此,在后续调用中,需要将str参数设置为NULL。

4. 如果字符串中不存在更多的分隔符,strtok函数将返回NULL指针。

请注意:strtok函数会破坏被分解字符串的完整性。调用strtok函数后,原字符串str的内容会被修改,因为它会将分隔符替换为'\0'。因此,通常建议对原始字符串进行拷贝,并在拷贝的字符串上使用strtok,以避免修改原始数据。

2. strtok函数的使用
#include<stdio.h>
#include<string.h>int main() {char arr[] = "111.222.333.444";char* sep = ".";                //分隔符为"."char* str = NULL;for (str = strtok(arr, sep); str != NULL; str = strtok(NULL, sep)) {printf("%s\n", str);}return 0;
}

执行结果为:

111

222

333

444

我们一起来分析分析:

111.222.333.444

使用strtok函数后,它会在在找到分隔符的位置后,将那个位置的字符设置为'\0' 来结束当前的标记。

然后从上一次标记的地方开始找下一个标记,直至结束。

简而言之,就是“strtok函数会把目标字符串中间的符号作为分隔符,将目标字符串分为几个子串”。

5. strerror函数

5.1 strerror函数的用法

strerror函数可以把参数部分错误码对应的错误信息的字符串地址返回来。

函数原型如下:

char* strerror(int errnum);

在不同的系统和C语言标准库的实现中都规定了一些错误码,一般放在errno.h 这个头文件中说明的,C语言程序启动的时候就会使用一个全局变量errno来记录程序的当前错误码,只不过程序启动的时候errno是0,表示没有错误,当我们在使用标准库中的函数的时候发生了某种错误,就会将对应的错误码,存放在errno中,而一个错误码的数字是整数,很难理解是什么意思,所以每一个错误码都是有对应的错误信息的。strerror函数就可以将错误对应的错误信息字符串的地址返回。

5.2 strerror的使用
#include<stdio.h>
#include<string.h>int main() {int i = 0;for (i = 0; i < 10; i++) {printf("%s\n", strerror(i));}return 0;
}

输出的结果为:

  • No error   (没有错误。这通常表示操作成功,没有发生任何错误)
  • Operation not permitted(操作不允许。这表明尝试进行的操作由于权限不足或其他限制而未能执行)
  • No such file or directory(没有这样的文件或目录。这通常意味着程序试图访问一个不存在的文件或目录)
  • No such process(没有这样的进程。这通常发生在尝试运行或管理一个不存在的进程时)
  • Interrupted function call(被中断的函数调用。这可能是由于某些外部因素(如用户中断)导致正在执行的函数被突然终止)
  • Input/output error(输入/输出错误。这通常发生在读取或写入文件或其他设备时,可能是由于设备故障、文件系统损坏或其他问题导致的)
  • No such device or address(没有这样的设备或地址。这通常表示程序试图访问一个不存在的设备或网络地址)
  • Arg list too long(参数列表过长。这通常发生在命令行参数超过系统限制时)
  • Exec format error(执行格式错误。这通常意味着尝试执行的程序或文件格式不正确或不被支持)
  • Bad file descriptor(错误的文件描述符。这通常表明程序尝试使用了一个无效或未正确初始化的文件描述符)

片尾

字符串函数的内容就先讲到这里,下一篇文章我们将会学习内存操作函数

看到这里的友友们,感谢你们的支持,

求个点赞收藏加关注!!!

十分感谢! ! ! 




 

相关文章:

C语言: 字符串函数(下)

片头 在上一篇中,我们介绍了字符串函数。在这一篇章中&#xff0c;我们将继续学习字符串函数&#xff0c;准备好了吗&#xff1f;开始咯&#xff01; 1.strncpy函数 1.1 strncpy函数的用法 strncpy是C语言中的一个字符串处理函数&#xff0c;它用于将一个字符串的一部分内容…...

WPF 数据绑定类属性 和数据更新

WPF中数据绑定是一个非常强大的功能&#xff0c;不仅可以绑定后台数据&#xff0c;还可以进行实时更新。 数据绑定实例 : 在后台创建模型类&#xff0c;然后在标签页面进行导入并绑定。 第一步: // 在后台创建模型类 public class MyData {public string Name { get; set; }…...

使用云服务器搭建CentOS操作系统

云服务器搭建CentOS操作系统 前言一、购买云服务器腾讯云阿里云华为云 二、使用 XShell 远程登陆到 Linux关于 Linux 桌面下载 XShell安装XShell查看 Linux 主机 ip使用 XShell 登陆主机 三、无法使用密码登陆的解决办法 前言 CentOS是一种基于Red Hat Enterprise Linux&#…...

unity的引用传递和数组的联系

引用传递 //引用传递 static void SetY(out int x,out int y ){x 0;y 0;x 1000;}static void Main(string[] args){int x 0;int y 10;SetY(out x, out y);Console.WriteLine($"x{x},y{y}");} 结果是&#xff1a;x1000&#xff0c;y0 数组的引用传递 数组值…...

Android bug Unresolved reference: BR

新建项目后 导入viewBinding 编译后提示 Unresolved reference: BR 解决办法 app 目录下 build.gradle 中 plugins 节点 添加 id kotlin-kapt参考 https://stackoverflow.com/questions/77409050/could-not-find-androidx-corecore-ktx1-8-10...

Unity DOTS1.0 入门(1) ECS机制与概述

ECS机制与概述 Entity:实体 由一个一个的Component组合在一起&#xff0c;是连续的内存布局。通过EnitityManager来负责高效的分配和释放相关entity. World:世界 一个entity的集合,在当前世界里面&#xff0c;每个Entity都有唯一不同的entityld;运行时Unity会自动创建一个D…...

root管理员用户启动kibana报错

问题描述: CentOS7.9.2009环境,以root管理员用户启动kibana7.11.1程序报如下错误: Kibana should not be run as root. Use --allow-root to continue. [root@elasticsearch bin]# whoami root [root@elasticsearch bin]# pwd /usr/local/kibana-7.11.1-linux-x86_64/bi…...

【leetcode面试经典150题】50. 插入区间(C++)

【leetcode面试经典150题】专栏系列将为准备暑期实习生以及秋招的同学们提高在面试时的经典面试算法题的思路和想法。本专栏将以一题多解和精简算法思路为主&#xff0c;题解使用C语言。&#xff08;若有使用其他语言的同学也可了解题解思路&#xff0c;本质上语法内容一致&…...

第二期书生浦语大模型训练营第三次笔记

RAG RAG是什么&#xff1f; RAG&#xff08;Retrieval Augmented Generation&#xff09;技术&#xff0c;通过检索与用户输入相关的信息片段&#xff0c;并结合外部知识库来生成更准确、更丰富的回答。解决 LLMs 在处理知识密集型任务时可能遇到的挑战, 如幻觉、知识过时和缺…...

SpringMVC(一)【入门】

前言 学完了大数据基本组件&#xff0c;SpringMVC 也得了解了解&#xff0c;为的是之后 SpringBoot 能够快速掌握。SpringMVC 可能在大数据工作中用的不多&#xff0c;但是 SSM 毕竟是现在就业必知必会的东西了。SpringBoot 在数仓开发可能会经常用到&#xff0c;所以不废话学吧…...

SQL Server详细使用教程

SQL Server 是 Microsoft 公司开发的关系型数据库管理系统&#xff08;RDBMS&#xff09;&#xff0c;用于存储和检索数据。以下是 SQL Server 的详细使用教程&#xff1a; 目录 1. 安装 SQL Server 2. 连接到 SQL Server 3. 创建数据库 4. 创建数据表 5. 插入数据 6. 查…...

Spring Boot项目启动时执行指定的方法

项目场景&#xff1a; 本文介绍Spring Boot项目启动时执行指定的方法两种常用方式和他们之间的区别。 实现方案&#xff1a; 方式一&#xff1a;使用注解PostConstruct Component public class PostConstructTest {PostConstructpublic void postConstruct() {System.out.prin…...

红豆Cat 1开源|项目三: 从0-1设计一款HTTP版本RTU(支持GNSS)产品的软硬件全过程

HTTP版RTU&#xff08;支持GNSS&#xff09;项目概述 RTU&#xff08;Remote Terminal Unit&#xff09;&#xff0c;中文即远程终端控制系统&#xff0c;负责对现场信号、工业设备的监测和控制。RTU是构成企业综合自动化系统的核心装置&#xff0c;通常由信号输入/出模块、微…...

在 Mac 上配置高级内容缓存设置

在 Mac 上配置高级内容缓存设置 您可以使用高级配置参数针对网络配置微调内容缓存。 您可以在“终端”中使用命令行或通过修改“/资源库/Preferences/com.apple.AssetCache.plist”文件中的键值&#xff0c;来设定内容缓存的高级配置参数。若要使某些更改生效&#xff0c;必须…...

算法与数据结构 顺序栈(C++)

随机产生10个100以内的整数建立一个顺序栈&#xff0c;从栈顶到栈底依次显示栈内元素&#xff1b;从键盘输入出栈元素个数 n (1< n <10)&#xff0c;将 n 个元素依次出栈并显示出栈元素&#xff0c;再显示此时栈顶元素。 #include <iostream> #include <cstd…...

【WSL】在WIN11安装并使用Linux子系统(Ubuntu)

前言&#xff1a; 最近买了4060Ti 16G&#xff0c;可以尝试在本地实验大模型。一开始尝试使用Vmware搞Linux&#xff0c;发现没有办法加载GPU&#xff08;或者另外有办法没找到&#xff09;。所以只剩下了两条路&#xff1a;要么搞双系统&#xff0c;要么使用WSL&#xff08;W…...

【vim 学习系列文章 20 -- a:mode 的值有哪些?】

请阅读【嵌入式开发学习必备专栏 之 Vim】 文章目录 a:mode 的值有哪些?举例Vim 底部状态栏设置 a:mode 的值有哪些? 在 Vim 脚本语言中&#xff0c;a:mode 常常用于函数内部&#xff0c;以获取该函数被调用时 Vim 正处于的模式。它主常用于那些可以从不同模式下被调用的函数…...

sed命令多行处理

1. sed 如何工作的 sed 维护两个空间&#xff1a; 模式空间保留空间 sed是以行为周期来处理文本的。 sed从输入流中读取一行&#xff0c;去掉最后的换行符&#xff0c;把它放入模式空间。随后执行命令&#xff0c;每个命令都有关联的地址和条件&#xff0c;只有匹配时才执行…...

Secure Copy Protocol or SCP - 安全拷贝协议

Secure Copy Protocol or SCP - 安全拷贝协议 1. scp 文件传输1.1. 将远程文件拷贝到本地1.2. 将本地文件拷贝到远程1.3. 将远程目录拷贝到本地 References Secure Copy (remote file copy program) The SCP program is a software tool implementing the SCP protocol as a s…...

Java面试题:什么是Java的值传递和引用传递?列举其应用场景,并说明其特点

在Java中&#xff0c;值传递和引用传递是两种不同的参数传递机制。它们在Java程序中扮演着重要的角色&#xff0c;影响着方法如何接收和处理参数。了解这两种传递机制对于编写高效、可靠的Java代码至关重要。 值传递&#xff08;Pass by Value&#xff09; 值传递是指在调用方…...

Java 基于微信小程序的智能停车场管理小程序

博主介绍&#xff1a;✌程序员徐师兄、7年大厂程序员经历。全网粉丝12w、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专栏推荐订阅&#x1f447;…...

python基础——类型注解【变量,函数,Union】

&#x1f4dd;前言&#xff1a; 上一篇文章Python基础——面相对象的三大特征提到&#xff0c;python中的多态&#xff0c;python中&#xff0c;类型是动态的&#xff0c;这意味着我们不需要在声明变量时指定其类型。然而&#xff0c;这可能导致运行时错误&#xff0c;因为我们…...

人工智能研究生前置知识—科学计算库numpy

人工智能研究生前置知识—科学计算库numpy numpy是python中做科学计算的基础库&#xff0c;对数组进行操作 整个numpy的操作和使用比较简单因此可以通过案例的学习掌握基本的用法在之后的学习中不断的进行熟悉和补充 创建数组&#xff08;矩阵 &#xff09; 创建的ndarray数组…...

element UI 设置type=“textarea“ 禁止输入框缩放

背景 在 Element UI 中&#xff0c;当您使用 el-input 组件并设置 type"textarea" 时&#xff0c;默认情况下&#xff0c;用户可以通过拖动输入框的右下角来调整其大小。如果您想禁止这种缩放行为&#xff0c;需要使用 CSS 来覆盖默认的浏览器行为。 注意上图&#x…...

Rust腐蚀服务器常用参数设定详解

Rust腐蚀服务器常用参数设定详解 大家好我是艾西&#xff0c;一个做服务器租用的网络架构师上期我们分享了rust腐蚀服务器的windows系统搭建方式&#xff0c;其中启动服务器bat参数因为涉及的东西比较多所以想通过这篇文章给大家做一下详细的分享。 &#xff08;注本文中xxxx…...

无人机巡检技术革命性变革光伏电站运维管理

在中国广袤的大地上&#xff0c;光伏电站如雨后春笋般崛起&#xff0c;晶体硅组件板在阳光下熠熠生辉&#xff0c;为人们带来了源源不断的绿色能源。然而&#xff0c;随着光伏产业的迅猛发展&#xff0c;电站运维管理面临着前所未有的挑战。而无人机巡检技术的引入&#xff0c;…...

【学习】软件信创测试中,如何做好兼容性适配

在软件信创测试的领域中&#xff0c;兼容性适配是至关重要的一环。如何确保软件在不同的操作系统、硬件设备和软件环境中稳定运行&#xff0c;是每个测试人员需要面对的挑战。本文将从几个方面探讨如何做好兼容性适配&#xff0c;以提高软件的稳定性和用户体验。 首先&#xf…...

阿里云ACK k8s集群迁移

1、创建k8s集群 阿里云ACK创建 2、创建所需的第三方插件 ACK ingress创建 3、导出原有ACK集群配置 包含deployment、service、ingress、PersistentVolumeClaim 执行命令 kubectl get deployment,service,secret,ingress,PersistentVolumeClaim -n <namespace_name> -o y…...

1.3 字符设备驱动

1、字符设备驱动工作原理 2、file_operations结构体 struct file_operations { struct module *owner; //拥有该结构的模块的指针&#xff0c;一般为THIS_MODULES loff_t (*llseek) (struct file *, lof…...

计算机毕业设计springboot小区物业报修管理系统m8x57

该物业报修管理系统实施的目的在于帮助物业管理企业升级员工管理、住户管理、报修问题管理等内部管理平台&#xff0c;整合物业管理企业物力和人力&#xff0c;全面服务于维修人员管理的内部管理需求,并重视需求驱动、管理创新、与业主交流等外部需求,通过物业管理企业各项资源…...

wordpress慢 数据库/seo网站优化助理

本文简介decorator模块是 Michele Simionato 为简化python的decorator的使用难度而开发的&#xff0c;使用它&#xff0c;您可以更加容易的使用decorator机制写出可读性、可维护性更好的代码。本文大部分翻译自下面这篇文档: www.phyast.pitt.edu/~micheles/python/documentati…...

做app推广上哪些网站吗/微信营销模式

Contens第四周1、爬虫的基本流程有&#xff1a;1.1、Request&#xff08;请求&#xff09;1.2、Response&#xff08;响应&#xff09;&#xff1a;第五周&#xff1a;*知识拓展&#xff1a;*1、HTML&#xff08;超文本标记语言&#xff09;2、XHTML是更纯净更严格的HTML代码第…...

如何利用国外网站做自媒体/新闻头条最新消息30字

原已经安装好的nginx&#xff0c;现在需要添加一个未被编译安装的模块: nginx -V 可以查看原来编译时都带了哪些参数 原来的参数&#xff1a; --prefix/app/nginx 添加的参数: --with-http_stub_status_module --with-http_ssl_module --with-http_realip_module nginx第三方模…...

如何提高wordpress访问速度/谷歌搜索引擎363

转载原文在win环境下使用Git与GitHub建立关联or第二篇文章or图解说...

网站怎么做前台跟后台的接口/全网推广公司

两种注册类型的区别是&#xff1a; 1)第一种不是常驻型广播&#xff0c;也就是说广播跟随activity的生命周期。注意: 在activity结束前&#xff0c;移除广播接收器。 2)第二种是常驻型&#xff0c;也就是说当应用程序关闭后&#xff0c;如果有信息广播来&#xff0c;程序也会被…...

微信运营服务商/长沙官网seo

一&#xff0c;次最小生成树 定义&#xff1a;设T是图G的最小生成树&#xff0c;如果T1满足ω(T1)min{ω(T’)| T’∈Not(T)},则T1是G的次小生成树。 解释&#xff1a;除了最小生成树外&#xff0c;另外一个生成树的权值和最小的生成树&#xff0c;定义为次最小生成树。 经典题…...