【c语言进阶】字符函数和字符串函数知识总结
字符函数和字符串函数
- 前期背景
- 求字符串长度函数
- strlen函数
- strlen函数三种模拟实现
- 长度不受限制的字符串函数
- strcpy函数
- strcpy函数模拟实现
- strcat函数
- strcat函数模拟实现
- strcmp函数
- strcmp函数模拟实现
- 长度受限制的字符串函数
- strncpy函数
- strncpy函数模拟实现
- strncat函数
- strncat函数模拟实现
- strncmp函数
- strncmp函数模拟实现
- 字符串查找
- strstr函数
- strstr函数模拟实现
- strtok函数
- 错误信息报告
- strerror函数
- perror函数
- 字符分类函数
- 大小写转化函数
- 内存操作函数
- memcpy函数
- memcpy函数模拟实现
- memmove函数
- memmove函数模拟实现
- memset函数
- memcmp函数
铁汁们,今天给大家分享一篇字符函数和字符串函数全面知识总结,来吧,开造⛳️
前期背景
在C语言具有许多数据类型,但不具有字符串类型,字符串通常放在字符指针或字符数组中,因为在C语言中对字符和字符串的处理很频繁,从而延伸出许许多多有关字符串的函数。
求字符串长度函数
strlen函数
功能:求字符串中元素的个数,不包括末尾的 ’ \0 '。 头文件为#include<string.h>。

字符串是以 ’ \0 '作为结束标志,strlen函数返回的是在字符串中 ’ \0 '前面的总元素个数(不包括 ’ \0 ') 。
注意:
1.strlen函数的返回值为 size_t ,无符号整形(unsigned int)。
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include<string.h>
int main()
{const char* str1 = "abcdef"; //元素个数为6个const char* str2 = "bbb"; //元素个数为3个if (strlen(str2) - strlen(str1) > 0) //两个无符号进行运算,则结果也为无符号{printf("str2>str1\n");}else{printf("srt1>str2\n");}return 0;
}

图解:

2.参数指向的字符串必须要以 ‘\0’ 为结束标志,否则,strlen会越界一直找’ \0 ',直到遇到 ’ \0 ’ 停止,结果为随机值。
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include<string.h>
int main()
{char arr1[8] = "abcde";char arr2[5] = {'a','b','c','d','e'};printf("%d\n",strlen(arr1));printf("%d\n",strlen(arr2));return 0;
}

strlen函数三种模拟实现
1.计数器
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include<assert.h>
int my_strlen(const char* arr) //计数器模拟实现strlen
{assert(arr); //断言,检查指针的有效性,防止对空指针进行解引用、加减整数操作int count = 0;while (*arr){count++;arr++;}return count;
}int main()
{char arr[10] = "hello bit";int len = my_strlen(arr);printf("%d\n", len);return 0;
}
2.指针-指针(计算的是两指针之间的元素个数)
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include<assert.h>
int my_strlen(const char* arr) //指针-指针模拟实现strlen
{assert(arr); //断言,检查指针的有效性,防止对空指针进行解引用、加减整数操作char* start = arr;char* end = arr;while (*end)end++;return end - start;
}int main()
{char arr[10] = "hello bit";int len = my_strlen(arr);printf("%d\n", len);return 0;
}
3.递归
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include<assert.h>
int my_strlen(const char* arr) //递归模拟实现strlen
{assert(arr); //断言,检查指针的有效性,防止对空指针进行解引用、加减整数操作if (*arr != '\0')return my_strlen(arr + 1) + 1;elsereturn 0;
}int main()
{char arr[10] = "hello bit";int len = my_strlen(arr);printf("%d\n", len);return 0;
}

长度不受限制的字符串函数
strcpy函数
功能:将源头字符串的内容拷贝到目标字符串,包括末尾的 ‘\0’(相当于从前往后进行覆盖)。 头文件为#include<string.h>。

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include<string.h>
int main()
{char dest[20] = "abcdefg";char source[6] = "hello";strcpy(dest, source + 2); //可以从源字符串的任意位置处开始拷贝printf("%s", dest);return 0;
}

=注意:
1.会将源头字符串的 '\0’拷贝进去。2.目标空间要足够大,足以存放源头字符串。
3.目标空间必须是可变的(不能被const修饰)。
4.源头字符串必须以 ‘\0’ 为结束标志(因为strcpy拷贝完\0’后就立即停止拷贝)。
strcpy函数模拟实现
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include<string.h>
#include<assert.h>
char* my_strcpy(char* dest, const char* source)
{assert(dest&&source); //断言,检查指针的有效性,防止对空指针进行解引用、加减整数操作char* ret = dest;while (*dest++ = *source++){;}return ret;
}int main()
{char dest[20] = "abcdefg";char source[6] = "hello";char* ret = my_strcpy(dest, source);printf("%s", ret);return 0;
}
strcpy在内存中的拷贝过程:


strcat函数
功能:将源头字符串的内容追加到目标字符串的后面(从目标串的’\0’位置开始向后追加)。 头文件为#include<string.h>。

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include<string.h>
int main()
{char dest[30] = "heihei";char source[] = " hello";strcat(dest, source);printf("%s", dest);return 0;
}

注意:
1.目标字符串必须可修改。
2.源字符串必须含有 '\0’为结束标志。
3.目标空间要足够大,足以容纳源头字符串的内容。
问题:字符串是否可以自己给自己追加?
答:字符串不可以自己给自己追加,因为源头字符串的’\0’会被覆盖,造成源头字符串会一直向后死循环追加。strcat遇到源头字符串的 ‘\0’就停止追加,并且源头字符串末尾的’\0’也会被追加过去。

strcat函数模拟实现
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include<assert.h>
char* my_strcat(char* dest,const char* source)
{assert(dest&&source); //断言,检查指针的有效性,防止对空指针进行解引用、加减整数操作char* ret = dest;while (*dest) //找目标字符串中的'\0'{dest++;}while (*dest++ = *source++){;}return ret;
}int main()
{char dest[30] = "abcde";char source[] = "hello bit";char* ret = my_strcat(dest, source);printf("%s", ret);return 0;
}

strcmp函数
功能:用来比较两字符串的大小,两字符串不能直接用==进行比较。 头文件为#include<string.h>。

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include<string.h>
int main()
{char s1[] = "abcdefg";char s2[] = "abcde";int ret=strcmp(s1, s2);printf("%d\n", ret);return 0;
}

问题:strcmp如何判断两字符串大小?
答:两个字符串从前向后依次比较两个字符,判断是否相等,相等,则继续比较下一个字符,直到有一个串遇到’\0’,并比较完’\0’,就停止。若不相等,比较两字符的ASCII值,ASCII值大的串,字符串大。《—等价于—》ASCII值的比较

strcmp返回值三种情况:
a.字符串1(前面的参数)大于 字符串2(后面的参数),则返回大于0的数。
b.字符串1(前面的参数)小于 字符串2(后面的参数),则返回小于0的数。
c.字符串1(前面的参数)等于 字符串2(后面的参数),则返回等于0的数。
strcmp函数模拟实现
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
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;
}int main()
{char s1[] = "abcde";char s2[] = "abcdef";int ret = my_strcmp(s1, s2);printf("%d", ret);return 0;
}

长度受限制的字符串函数
strncpy函数
功能: 头文件为#include<string.h>。
情况1:源字符串的长度>num,将源字符串的前num个字符拷贝到目标字符串中;
情况2:源字符串的长度<num将源字符串全部拷贝到目标字符串中,包括源字符串末尾的’\0’,源字符串拷贝完后,在目标字符串的后面一直追加 ‘\0’,直到num停止。

情况1代码:
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include<string.h>
int main()
{int num = 5; //源字符串的长度>numchar dest[30] = "heheabcd";char source[] = "lala hello";strncpy(dest, source, num);printf("%s", dest);return 0;
}

情况2代码
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include<string.h>
int main()
{int num = 20; //源字符串的长度<numchar dest[30] = "heheabcdefghi";char source[] = "lala hello";strncpy(dest, source, num);printf("%s", dest);return 0;
}

内存图:

strncpy函数模拟实现
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include<assert.h>
char* my_strncpy(char* dest,const char* source, int num)
{assert(dest && source);char* ret = dest;while (num--){if (*source != '\0') //情况1,源字符串的长度>num*dest++ = *source++;else //情况2,源字符串的长度<num,源字符串拷贝完后,在目标字符串后一直追加'\0'*dest++ = '\0';}return ret;
}int main()
{int num = 5;char dest[30] = "heheabcdefghi";char source[] = "lala hello";char* ret = my_strncpy(dest, source, num);printf("%s\n", dest);return 0;
}

strncat函数
功能: 头文件为#include<string.h>。

情况1:源字符串的长度>num,将源字符串的前num个字符追加到目标字符串后面,最后在目标字符串后面自动补上 ‘\0’;
情况2:源字符串的长度<num将源字符串全部追加到目标字符串后面,包括源字符串末尾的’\0’,则就停止追加。
情况1代码:
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include<assert.h>
#include<string.h>
int main()
{int num = 5; //情况1,源字符串的长度>numchar dest[30] = "abcde\0lalalalalala";char source[] = "hello world";strncat(dest, source, num); printf("%s\n", dest);return 0;
}


情况2代码:
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include<assert.h>
#include<string.h>
int main()
{int num = 20; //情况2,源字符串的长度<numchar dest[30] = "abcde\0lalalalalalalalalalala";char source[] = "hello world";strncat(dest, source, num);printf("%s\n", dest);return 0;
}


strncat函数模拟实现
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include<assert.h>
char* my_strncat(char* dest, const char* source,int num)
{assert(dest && source);char* ret = dest;while (*dest)dest++;while (num--){*dest = *source;if (*source == '\0') //清款2break;dest++;source++;}if (*source != '\0') //情况1*dest = '\0';return ret;
}int main()
{int num =5;char dest[30] = "abcde\0lalalalalalalalalalala";char source[] = "hello world";char* ret=my_strncat(dest, source, num);printf("%s\n", ret);return 0;
}

strncmp函数
功能:比较前num个字符的大小, 头文件为#include<string.h>。
比较到在num范围内有一个串结束、两串中有一个字符不相等,前num个字符全部比完,就停止比较了。

返回值三种情况:同strcmp函数返回值情况相同。

strncmp函数模拟实现
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include<assert.h>
int my_strncmp(const char* s1,const char* s2, int num)
{assert(s1&&s2);while (num--){while (*s1 == *s2){if(*s1 == '\0')return 0;s1++;s2++;}return *s1-*s2;}
}int main()
{int num = 3;char arr1[] = "abcdef";char arr2[] = "abed";int len = my_strncmp(arr1, arr2,num);printf("%d\n", len);return 0;
}

字符串查找
strstr函数
功能:在string指向的字符串中查找strCharSet指向的字符串是否出现,出现,则返回strCharSet指向的字符串在tring指向的字符串第一次出现的起始位置,若未出现,则返回NULL。 头文件为#include<string.h>。

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include<assert.h>
#include<string.h>
int main()
{char arr[] = "abcdefbcdef";char src[] = "bcdef";char* ret=strstr(arr, src);printf("%s\n", ret);return 0;
}

strstr函数模拟实现
版本1:
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include<assert.h>
char* my_strstr(char* dest, char* src)
{assert(dest && src);char* cur = dest;char* s1;char* s2;while (*cur){s1 = cur;s2 = src;while (*s2&&*s1){if (*s1 != *s2)break;s1++;s2++;}if (*s2 == '\0')return cur;cur++;}
}int main()
{char arr[] = "abbbcdefbcdef";char src[] = "bcdef";char* ret=my_strstr(arr, src);printf("%s\n", ret);return 0;
}


版本2:枚举法(效率更高)
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include<assert.h>
#include<string.h>
char* my_strstr(char* dest, char* src)
{assert(dest && src);char* ret = dest;int len1 = strlen(dest);int len2 = strlen(src);int i=0;for ( ; i + len2 <= len1; i++){int j = 0;for (; j < len2; j++){if (dest[i+j] != src[j])break;}if (j == len2)return (ret + i);}return NULL;
}int main()
{char arr[] = "abbbcdefbcdef";char src[] = "bcdef";char* ret=my_strstr(arr, src);printf("%s\n", ret);return 0;
}


strtok函数
功能:用于处理带标记的字符串。头文件为#include<string.h>。

注意:
1.参数2strDelimit指向的字符串定义了用作分隔符的集合,注意参数2必须是字符串,而’\0‘代表的是字符串结束符,通常用于标记字符串的末尾,并不作为分隔符。
2.strToken指向的字符串,它包含了0个或者多个strDelimit指向字符串的分隔符标记。
3.strtok函数找到strDelimit指向字符串中的下一个分隔符的标记,并会自动保存这个标记符在字符串的位置,返回一个指向这个标记的指针。
4.当第一个参数不为NULL,找到第一个分割符标记,该函数内部会自动保存这个标记符在字符串的位置,进行第二次使用strtok函数时,函数的第一个参数为NULL,该函数会从上次strtok函数保存的上个分割标记符后一个位置处查询下一个分割标记符并保存下一个分割标记符所在字符串中的位置,直到不存在分隔符停止查找。
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include<string.h>
int main()
{char arr1[] = "naifu,naiyou.fsq#zzx";const char* arr2= ",.#";for (char* ret = strtok(arr1, arr2); ret != NULL; ret=strtok(NULL, arr2)){printf("%s\n", ret);}return 0;
}

错误信息报告
strerror函数
功能:返回错误码所对应的错误信息。头文件为#include<string.h>。

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include<string.h> //strerror库函数的头文件
#include<errno.h> //必须包含的头文件
int main()
{FILE* p = fopen("lala.txt", "r");if (p == NULL){printf("%s\n", strerror(errno)); //errno存放错误码return 1;}fclose(p);p = NULL;return 0;
}

strerror函数可以用于确定库函数在执行时发生的错误的原因。当库函数遇到错误时,它会设置一个全局变量errno,C语言会将错误码存放在errno这个全局变量中,strerror函数使用errno确定特定错误码对应的错误消息。
perror函数
功能:返回错误码所对应的错误信息。头文件为#include<stdio.h>。

与strerror作用效果相同,只是perror会输出string指向的字符串内容在加个冒号(:),在输出错误码所对应的错误信息,在文件操作中,确定错误信息是什么,常用perror函数。
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
int main()
{FILE* p = fopen("lala.txt", "r");if (p == NULL){perror("fopen");return 1;}fclose(p);p = NULL;return 0;

字符分类函数
头文件为#include<ctype.h>。

大小写转化函数
头文件为#include<ctype.h>

内存操作函数
memcpy函数
功能:从src位置向后拷贝count个字节的内容到dest指向的字符串中(遇到\0不会停下来)。若拷贝的字节数大于源头字符串的总字节数,超过的字节数拷贝的内容为随机值。 头文件为#include<string.h>。
注意:memecpy适用于不重叠数据或者无关联的数据拷贝。

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include<string.h>
int main()
{int count = 4;int arr[10] = { 1,2,3,4,5,6 };int src[6] = { 7,8,9,10,11,12 };memcpy(arr, src, sizeof(arr[0])*count);for (int i = 0; i <10; i++)printf("%d ", arr[i]);return 0;
}

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include<string.h>
int main()
{int count = 3;int arr[10] = { 1,2,3,4,5,6 };int src[3] = { 7,8,9};memcpy(arr, src, sizeof(arr[0])*count);for (int i = 0; i <10; i++)printf("%d ", arr[i]);return 0;
}

memcpy函数模拟实现
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include<assert.h>
#include<string.h>
void* my_memcpy(void* dest, void* src, int count) //适用于任意类型
{assert(dest && src);while (count--){*(char*)dest = *(char*)src; //对空指针进行解引用操作,具有临时性,有效时长仅在其所在的语句中(char*)dest = (char*)dest + 1; //(char*)dest++,因优先级:++>(),dest(NULL)先与++结合,不能对空指针进行加减、解引用操作(char*)src = (char*)src + 1;}return ;
}int main()
{int count = 4;int arr[10] = { 1,2,3,4,5,6,7,8 };int src[6] = { 9,10,11,12 };int len = sizeof(arr) / sizeof(arr[0]);my_memcpy(arr, src, sizeof(arr[0] )* count);for (int i = 0; i < len; i++){printf("%d ", arr[i]);}return 0;
}

问题:memcpy可以拷贝重叠数据吗?
答:memcpy不可以拷贝重叠数据,会造成数据被覆盖。
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include<assert.h>
#include<string.h>
void* my_memcpy(void* dest, void* src, int count) //适用于任意类型
{assert(dest && src);while (count--){*(char*)dest = *(char*)src; //对空指针进行解引用操作,具有临时性,有效时长仅在其所在的语句中(char*)dest = (char*)dest + 1; //(char*)dest++,因优先级:++>(),dest(NULL)先与++结合,不能对空指针进行加减、解引用操作(char*)src = (char*)src + 1;}return ;
}int main()
{int count = 5;int arr[10] = { 1,2,3,4,5,6,7,8 };int src[6] = { 9,10,11,12 };int len = sizeof(arr) / sizeof(arr[0]);my_memcpy(arr+2, arr, sizeof(arr[0] )* count); //memcpy拷贝重叠数据for (int i = 0; i < len; i++){printf("%d ", arr[i]);}return 0;
}


memmove函数
功能:从src位置向后拷贝count个字节的内容到dest指向的字符串中(遇到\0不会停下来)。若拷贝的字节数大于源头字符串的总字节数,超过的字节数拷贝的内容为随机值。 头文件为#include<string.h>。
注意:memmove既适用于重叠数据或者有关联的数据拷贝,又适用于不重叠数据或者无关联的数据拷贝。

重叠数据或者有关联的数据拷贝:
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include<assert.h>
int main()
{int count = 5;int arr[10] = { 1,2,3,4,5,6,7,8 };int len = sizeof(arr) / sizeof(arr[0]);memmove(arr+2, arr, sizeof(arr[0] )* count);for (int i = 0; i < len; i++){printf("%d ", arr[i]);}return 0;
}

不重叠数据或者无关联的数据拷贝:
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include<assert.h>
int main()
{int count = 5;int arr[10] = { 1,2,3,4,5,6,7,8 };int src[5] = { 9,10,11,12,13 };int len = sizeof(arr) / sizeof(arr[0]);memmove(arr,src, sizeof(arr[0] )* count);for (int i = 0; i < len; i++){printf("%d ", arr[i]);}return 0;
}

memmove函数模拟实现
memmove模拟实现图:

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include<assert.h>
void* my_memmove(void* dest, const void* src, int count)
{void* ret = dest;if (dest < src) //从前往后拷贝{while (count--){*((char*)dest) = *((char*)src);dest = (char*)dest + 1;src = (char*)src + 1;}}else //从后往前拷贝{while (count--){*((char*)dest + count) = *((char*)src + count);}}return ret;
}int main()
{int count = 5;int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };my_memmove(arr+2, arr, sizeof(int) * count); //重叠数据for (int i = 0; i < 10; i++){printf("%d ", arr[i]);}return 0;
}


问题:memmove与memcp有何区别?
答:memmove既可以处理重叠数据,又可处理不重叠数据(100%)。 memcpy被规定来只能用来处理不重叠或者无关联的数据(60%),但在有些编译器上,memcpy也可用来处理重叠数据,所以一般处理重叠数据的拷贝选择memmove,处理不重叠的数据选择memcpy。
memset函数
功能:将dest指向的内存空间的前count字节的内容全部设置为c。 头文件为#include<string.h>。

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
int main()
{int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };int count = 5;memset(arr, 0, sizeof(int) * count);for (int i = 0; i < 10; i++)printf("%d ", arr[i]);return 0;
}

应用场景:常适用于初始化一块连续的内存空间,eg:静态版通讯录实现。
memcmp函数
功能:将dest指向的内存空间前count字节的内容与src指向的内存空间前count字节的内容相比较,比较到在count字节范围内有一个空间结束、两空间中有一个字节不相等,前num个字节全部比完,就停止比较了,返回值与strncmp相同。

铁铁们,字符函数和字符串函数知识总结就到此结束啦,若博主有不好的地方,请指正,欢迎铁铁们留言,请动动你们的手给作者点个👍鼓励吧,你们的鼓励就是我的动力✨
相关文章:
【c语言进阶】字符函数和字符串函数知识总结
字符函数和字符串函数 前期背景求字符串长度函数strlen函数strlen函数三种模拟实现 长度不受限制的字符串函数strcpy函数strcpy函数模拟实现strcat函数strcat函数模拟实现strcmp函数strcmp函数模拟实现 长度受限制的字符串函数strncpy函数strncpy函数模拟实现strncat函数strnca…...
DB2实现正则表达式
DB2实现正则表达式 功能描述 db2 11.1 及以上版本支持正则表达式,但是db2 10.5及以下版本不支持正则表达式,需要手工创建正则表达式函数。 安装与卸载步骤 README.txt2010-07-30IBM IMTE - Project AvalancheAuthor: Alexandre GrancherThis file des…...
CASS数据带属性转GIS的shp数据教程
一、数据:DWG文件中含有JZD(宗地层),JZP(界址点层),其中JZP中含有界址点号,实现JZD层转成ZD的shp数据;JZP转成JZD点的shp数据,并带出界址点号。 二、实现原理…...
Jenkins配置自动化构建的几个问题
在创建构建任务时,填写git远程仓库地址时,出现以下报错 解决此报错先排查一下linux机器上的git版本 git --version 如果git 版本过低,可能会导致拉取失败,此时需要下载更高的git版本。 参考 Git安装 第二个解决办法报错信息中…...
ubuntu 命令调节显示器亮度
1.显示器名字 xrandr -q | grep " connected" HDMI-0 connected primary 1920x108000 (normal left inverted right x axis y axis) 527mm x 297mm DP-4 connected 1920x108019200 (normal left inverted right x axis y axis) 527mm x 297mm 2.调节亮度 xrandr --ou…...
打卡力扣题目七
#左耳听风 ARST 打卡活动重启# 目录 一、题目 二、解题方法一 三、解题方法二 关于 ARTS 的释义 —— 每周完成一个 ARTS: ● Algorithm: 每周至少做一个 LeetCode 的算法题 ● Review: 阅读并点评至少一篇英文技术文章 ● Tips: 学习至少一个技术技巧 ● Share:…...
【EI/SCOPUS会议征稿】第三届检测技术与自动化工程国际学术会议 (TTAE 2023)
第三届检测技术与自动化工程国际学术会议 (TTAE 2023)原定将于2023年9月15-17日在中国西安召开。 检测技术与自动化工程国际学术会议将每年举行一次,旨在将“检测技术”和“自动化工程”等学术领域的学者、专家、研发者、技术人员聚集到一个学术交流的平台…...
时序预测 | Python实现NARX-DNN空气质量预测
时序预测 | Python实现NARX-DNN空气质量预测 目录 时序预测 | Python实现NARX-DNN空气质量预测效果一览基本介绍研究内容程序设计参考资料效果一览 基本介绍 时序预测 | Python实现NARX-DNN空气质量预测 研究内容 Python实现NARX-DNN空气质量预测,使用深度神经网络对比利时空气…...
华为数字化转型之道-读书笔记1
第一章 数字化转型,华为的战略选择 1. 数字化转型是企业的必答题 1.1 解决时代难题:“鲍莫尔成本病” “体验变流量,流量变收入”是其常见的商业模式。数字化平台通过“作业即记录、记录及数据”的方式,能给企业带来很多好处&a…...
环形链表 II(JS)
环形链表 II 题目 给定一个链表的头节点 head ,返回链表开始入环的第一个节点。 如果链表无环,则返回 null。 如果链表中有某个节点,可以通过连续跟踪 next 指针再次到达,则链表中存在环。 为了表示给定链表中的环,…...
【字节三面】41. 缺失的第一个正数
41. 缺失的第一个正数 解题思路 在原数组上进行操作 如果数字是2 将其放在索引为1的位置上数字x 放在索引为x - 1的位置上对于长度为n的数组 其中没有出现的最小正整数只能在[1,n 1]引入如果1 - n 这些数都出现了 那么答案就是n 1如果都没有出现完全 那么答案就在[1,n]中没…...
Linux echo命令与反引号、重定向符号以及管道符
echo echo命令echo结合反引号echo结合重定向符echo结合管道符 echo命令 Linux中的echo命令用于在终端输出指定的文本内容或变量值。 基本语法如下: echo [选项] [字符串]常用选项包括: -e:启用特殊字符的解析,例如\n表示换行符…...
HTML基础知识点总结
目录 1.HTML简介 2.HTML基础结构 主要字符: 3.基础知识 (一)p标签 (二)hr标签 (三)尖角号 (四)版权号 (五)div和span div span (六)列表 (1&…...
VS附加到进程调试
操作: 要附加到进程中调试外部可执行文件,您需要使用Visual Studio的“调试附加”功能。以下是附加到进程中调试外部可执行文件的步骤: 打开您要调试的源代码文件或可执行文件。打开Visual Studio。选择“调试”菜单,然后选择“…...
基于深度学习的高精度狗狗检测识别系统(PyTorch+Pyside6+YOLOv5模型)
摘要:基于深度学习的高精度狗狗检测识别系统可用于日常生活中检测与定位120类狗狗目标,利用深度学习算法可实现图片、视频、摄像头等方式的狗狗目标检测识别,另外支持结果可视化与图片或视频检测结果的导出。本系统采用YOLOv5目标检测模型训练…...
从互联网到云时代,Apache RocketMQ 是如何演进的?
作者:隆基 2022 年,RocketMQ 5.0 的正式版发布。相对于 4.0 版本而言,架构走向云原生化,并且覆盖了更多业务场景。 消息队列演进史 操作系统、数据库、中间件是基础软件的三驾马车,而消息队列属于最经典的中间件之一…...
XML (可扩展标记语言)
目录 一、概念 二. 使用: 1. 基本语法: 2. 组成部分: (1)文档声明 (2) 指令(了解):结合css (3) 标签:标签名称自定义 (4)…...
socket()、bind()、listen()、htons()
socket() socket() 是一个系统调用函数,用于创建一个套接字(socket),通过该套接字进行网络通信。在这段代码中,socket() 函数被用于创建一个本地套接字。 具体来说,这是 socket() 在代码中的使用方式&…...
提升开发效率,Lombok的链式编程和构建模式
目录 链式编程 定义 代码示例 编辑 Accessors(chaintrue) 开启链式编程 编辑 Accessors(chain true,fluent true) 去除set和get 构建模式 定义 代码示例 编辑 踩坑 Singular 定义 代码示例 踩坑默认值情况 编辑 With 定义 代码示例 链式编程 定义 链…...
DuDuTalk:AI语音工牌如何帮助教培公司高效管理课程顾问团队
近年来,随着人工智能的快速发展,越来越多的公司开始利用AI技术来提高工作效率和管理效果。在教育培训行业中,课程顾问团队的管理对于公司的运营和发展至关重要。 而在实际管理中,受教培人员素质参差不齐,能力差异大&a…...
2025年能源电力系统与流体力学国际会议 (EPSFD 2025)
2025年能源电力系统与流体力学国际会议(EPSFD 2025)将于本年度在美丽的杭州盛大召开。作为全球能源、电力系统以及流体力学领域的顶级盛会,EPSFD 2025旨在为来自世界各地的科学家、工程师和研究人员提供一个展示最新研究成果、分享实践经验及…...
【网络安全产品大调研系列】2. 体验漏洞扫描
前言 2023 年漏洞扫描服务市场规模预计为 3.06(十亿美元)。漏洞扫描服务市场行业预计将从 2024 年的 3.48(十亿美元)增长到 2032 年的 9.54(十亿美元)。预测期内漏洞扫描服务市场 CAGR(增长率&…...
高频面试之3Zookeeper
高频面试之3Zookeeper 文章目录 高频面试之3Zookeeper3.1 常用命令3.2 选举机制3.3 Zookeeper符合法则中哪两个?3.4 Zookeeper脑裂3.5 Zookeeper用来干嘛了 3.1 常用命令 ls、get、create、delete、deleteall3.2 选举机制 半数机制(过半机制࿰…...
全球首个30米分辨率湿地数据集(2000—2022)
数据简介 今天我们分享的数据是全球30米分辨率湿地数据集,包含8种湿地亚类,该数据以0.5X0.5的瓦片存储,我们整理了所有属于中国的瓦片名称与其对应省份,方便大家研究使用。 该数据集作为全球首个30米分辨率、覆盖2000–2022年时间…...
Nginx server_name 配置说明
Nginx 是一个高性能的反向代理和负载均衡服务器,其核心配置之一是 server 块中的 server_name 指令。server_name 决定了 Nginx 如何根据客户端请求的 Host 头匹配对应的虚拟主机(Virtual Host)。 1. 简介 Nginx 使用 server_name 指令来确定…...
JVM暂停(Stop-The-World,STW)的原因分类及对应排查方案
JVM暂停(Stop-The-World,STW)的完整原因分类及对应排查方案,结合JVM运行机制和常见故障场景整理而成: 一、GC相关暂停 1. 安全点(Safepoint)阻塞 现象:JVM暂停但无GC日志,日志显示No GCs detected。原因:JVM等待所有线程进入安全点(如…...
全面解析各类VPN技术:GRE、IPsec、L2TP、SSL与MPLS VPN对比
目录 引言 VPN技术概述 GRE VPN 3.1 GRE封装结构 3.2 GRE的应用场景 GRE over IPsec 4.1 GRE over IPsec封装结构 4.2 为什么使用GRE over IPsec? IPsec VPN 5.1 IPsec传输模式(Transport Mode) 5.2 IPsec隧道模式(Tunne…...
dify打造数据可视化图表
一、概述 在日常工作和学习中,我们经常需要和数据打交道。无论是分析报告、项目展示,还是简单的数据洞察,一个清晰直观的图表,往往能胜过千言万语。 一款能让数据可视化变得超级简单的 MCP Server,由蚂蚁集团 AntV 团队…...
OPENCV形态学基础之二腐蚀
一.腐蚀的原理 (图1) 数学表达式:dst(x,y) erode(src(x,y)) min(x,y)src(xx,yy) 腐蚀也是图像形态学的基本功能之一,腐蚀跟膨胀属于反向操作,膨胀是把图像图像变大,而腐蚀就是把图像变小。腐蚀后的图像变小变暗淡。 腐蚀…...
Netty从入门到进阶(二)
二、Netty入门 1. 概述 1.1 Netty是什么 Netty is an asynchronous event-driven network application framework for rapid development of maintainable high performance protocol servers & clients. Netty是一个异步的、基于事件驱动的网络应用框架,用于…...
