【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相同。
在这里插入图片描述

铁铁们,字符函数和字符串函数知识总结就到此结束啦,若博主有不好的地方,请指正,欢迎铁铁们留言,请动动你们的手给作者点个👍鼓励吧,你们的鼓励就是我的动力✨

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/11900.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

粘包处理的方式

为什么出现粘包&#xff1a; 发送端在发送的时候由于 Nagel 算法的存在会将字节数较小的数据整合到一起发送&#xff0c;导致粘包&#xff1b;接收端不知道发送端数据的长度&#xff0c;导致接收时无法区分数据&#xff1b; 粘包处理的方式&#xff1a; 通过在数据前面加上报…

最新版本docker 设置国内镜像源 加速办法

解决问题:加速 docker 设置国内镜像源 目录: 国内加速地址 修改方法 国内加速地址 1.Docker中国区官方镜像 https://registry.docker-cn.com 2.网易 http://hub-mirror.c.163.com 3.ustc https://docker.mirrors.ustc.edu.cn 4.中国科技大学 https://docker.mirrors…

windows11打不开任务管理器,

目录 第一章、win11系统任务管理器打不开&#xff1f;第二章、解决方式修改注册表 友情提醒&#xff1a; 先看文章目录&#xff0c;大致了解文章知识点结构&#xff0c;点击文章目录可直接跳转到文章指定位置。 第一章、win11系统任务管理器打不开&#xff1f; Win11任务管理…

FPGA+EMMC 8通道存储小板

FPGA 采用XILINX公司A7100作为主芯片 AD采用AD7606及一款陀螺仪传感器&#xff0c;可以实时存储到EMMC&#xff0c;系统分为采集模式及回放模式 通过232接口对工作模式进行配置&#xff0c;采样率可以动态配置 回放采用W5100S通过TCP协议进行回放数据

【C语言进阶篇】回调函数都学了吧!那么用冒泡排序实现qsort函数你会嘛?

&#x1f3ac; 鸽芷咕&#xff1a;个人主页 &#x1f525; 个人专栏:《C语言初阶篇》 《C语言进阶篇》 ⛺️生活的理想&#xff0c;就是为了理想的生活! 文章目录 &#x1f4cb; 前言&#x1f4ac; qsort 和 冒泡排序的区别&#x1f4d1; qsort 的特点&#x1f4d1; 冒泡排序 …

JS逆向之猿人学爬虫第20题-wasm

文章目录 题目地址sign参数分析python算法还原往期逆向文章推荐题目地址 https://match.yuanrenxue.cn/match/20第20题被置顶到了第1页,题目难度 写的是中等 算法很简单,就一个标准的md5算法,主要是盐值不确定, 而盐值就在wasm里面,可以说难点就在于wasm分析 sign参数分…

[Linux]进程间通信

[Linux]进程间通信 文章目录 [Linux]进程间通信进程间通信什么是进程间通信进程间通信的目的进程间通信的本质为什么存在进程间通信进程间通信的分类 管道什么是管道匿名管道本质pipepipe的使用匿名管道读写情况匿名管道的特征 命名管道本质命令行创建命名管道创建和删除命名管…

如何在电脑上查看连接过的wifi信息?

忘记wifi密码&#xff1f;想要看看wifi信息&#xff1f; 我想这篇文章可以帮到你O(∩_∩)O哈哈~。 通过网络连接中心查看 电脑上找到“网络和共享中心” 点击连接的wifi名称 点击无线属性 在安全选项中就有密码 通过电脑命令行工具查看推荐 通过winr快捷键打开电脑运…

手动搭建gateway,项目集成gateway实现Token效果

目录 背景步骤1、首先创建springboot项目2、引入依赖3、配置文件&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff08;超级重要&#xff01;&#xff01;&#xff01;根据自己的需要进行配置&#xff09;4、相关类我们在服务中进行的白名单中接口的操作如…

信驰达推出RTL8720DN系列2.4G和5G双频Wi-Fi+蓝牙二合一模块

近日&#xff0c;领先的无线物联网通信模块厂商深圳信驰达科技RF-star推出了基于RTL8720DN SoC的2.4 GHz和5 GHz双频Wi-Fi蓝牙二合一模块—RF-WM-20DNB1。 图 1信驰达RF-WM-20DNB1 Wi-Fi模块 RF-WM-20DNB1是一款低功耗单芯片无线蓝牙和Wi-Fi组合模块&#xff0c;支持双频(2.4 G…

详细介绍如何使用HuggingFace和PyTorch进行医学图像分割-附源码

医学图像分割是一种创新过程,使外科医生能够拥有虚拟的“X 射线视觉”。它是医疗保健领域非常有价值的工具,可提供非侵入性诊断和深入分析。考虑到这一点,在这篇文章中,我们将探索威斯康辛大学麦迪逊分校胃肠道图像分割Kaggle 挑战数据集。作为该项目的一部分,我们将使用 …

爬虫005_python类型转换_其他类型转换为整型_转换为Float类型_转换为字符串_转换为布尔值---python工作笔记023

首先来看,字符串转换成int 很简单 float转换成int 会把小数点后面的内容丢掉 boolean转换为int true是1 false 是0 然后字符串转换为int,要注意 不能有特殊字符比如1.23 中有点 就报错 上面字符串12ab,有ab也报错 看上面

Docker可视化管理工具Portainer多机器安装使用

一、首先得安装docker Docker安装并指定主目录:https://blog.csdn.net/wdy_2099/article/details/77367107 二、使用docker方式安装portainer 安装命令如下&#xff1a; docker run -it -d \-p 8999:9000 \--name portainer \--restart always \-v /var/run/docker.sock:/v…

Linux Ubuntu crontab 添加错误 提示:no crontab for root - using an empty one 888

资料 错误提示&#xff1a; no crontab for root - using an empty one 888 原因剖析&#xff1a; 第一次使用crontab -e 命令时会让我们选择编辑器&#xff0c;很多人会不小心选择默认的nano&#xff08;不好用&#xff09;&#xff0c;或则提示no crontab for root - usin…

【图像分类】CNN + Transformer 结合系列.1

介绍三篇结合使用CNNTransformer进行学习的论文&#xff1a;CvT&#xff08;ICCV2021&#xff09;&#xff0c;Mobile-Former&#xff08;CVPR2022&#xff09;&#xff0c;SegNetr&#xff08;arXiv2307&#xff09;. CvT: Introducing Convolutions to Vision Transformers, …

Windows bat 查找文件被哪个进程占用,并终止该进程

一、背景 我有个批处理脚本如下&#xff1a; echo off chcp 936 & cls cd /D F:\Chen\python3\ExciseC set fdate%date:~0,4%%date:~5,2%%date:~8,2% python main.py >> crawl_record_%fdate%.log 2>&1 for /F %%f in (dir crawl_record_*.log /B ^| find /…

机器学习——异常检测

异常点检测(Outlier detection)&#xff0c;⼜称为离群点检测&#xff0c;是找出与预期对象的⾏为差异较⼤的对象的⼀个检测过程。这些被检测出的对象被称为异常点或者离群点。异常点&#xff08;outlier&#xff09;是⼀个数据对象&#xff0c;它明显不同于其他的数据对象。异…

Linux工具【1】(编辑器vim、编译器gcc与g++)

vim详解 引言vimVim的三种模式及模式切换普通模式下操作底行模式下操作 gcc与ggcc的使用&#xff08;g类似&#xff09;预编译编译汇编链接静态库与动态库 总结 引言 vim&#xff08;vi improved&#xff09;编辑器是从 vi 发展出来的一个文本编辑器。 代码补全、编译及错误跳…

opencv python 训练自己的分类器

源码下载 一、分类器制作 1.样本准备 收集好你所需的正样本&#xff0c;和负样本&#xff0c;分别保存在不同文件夹 在pycharm新建项目&#xff0c;项目结构如下&#xff1a;has_mask文件夹放置正样本&#xff0c;no_mask文件夹放置负样本 安装opencv&#xff0c;把opencv包…

Day.4 刷题练习(自守数)

题目&#xff1a; 例子&#xff1a; 分析题目&#xff1a; 主要目的&#xff1a;给定一个范围小于等于N&#xff0c;在这个范围中找自守数&#xff08;自身等于平方后的尾部数据如5&#xff1a;5 ^ 2 25 &#xff0c; 然后 5 与 平方的后的尾部相等&#xff09; 思路&#x…