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

【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 及以上版本支持正则表达式&#xff0c;但是db2 10.5及以下版本不支持正则表达式&#xff0c;需要手工创建正则表达式函数。 安装与卸载步骤 README.txt2010-07-30IBM IMTE - Project AvalancheAuthor: Alexandre GrancherThis file des…...

CASS数据带属性转GIS的shp数据教程

一、数据&#xff1a;DWG文件中含有JZD&#xff08;宗地层&#xff09;&#xff0c;JZP&#xff08;界址点层&#xff09;&#xff0c;其中JZP中含有界址点号&#xff0c;实现JZD层转成ZD的shp数据&#xff1b;JZP转成JZD点的shp数据&#xff0c;并带出界址点号。 二、实现原理…...

Jenkins配置自动化构建的几个问题

在创建构建任务时&#xff0c;填写git远程仓库地址时&#xff0c;出现以下报错 解决此报错先排查一下linux机器上的git版本 git --version 如果git 版本过低&#xff0c;可能会导致拉取失败&#xff0c;此时需要下载更高的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&#xff1a; ● Algorithm: 每周至少做一个 LeetCode 的算法题 ● Review: 阅读并点评至少一篇英文技术文章 ● Tips: 学习至少一个技术技巧 ● Share:…...

【EI/SCOPUS会议征稿】第三届检测技术与自动化工程国际学术会议 (TTAE 2023)

第三届检测技术与自动化工程国际学术会议 (TTAE 2023)原定将于2023年9月15-17日在中国西安召开。 检测技术与自动化工程国际学术会议将每年举行一次&#xff0c;旨在将“检测技术”和“自动化工程”等学术领域的学者、专家、研发者、技术人员聚集到一个学术交流的平台&#xf…...

时序预测 | Python实现NARX-DNN空气质量预测

时序预测 | Python实现NARX-DNN空气质量预测 目录 时序预测 | Python实现NARX-DNN空气质量预测效果一览基本介绍研究内容程序设计参考资料效果一览 基本介绍 时序预测 | Python实现NARX-DNN空气质量预测 研究内容 Python实现NARX-DNN空气质量预测,使用深度神经网络对比利时空气…...

华为数字化转型之道-读书笔记1

第一章 数字化转型&#xff0c;华为的战略选择 1. 数字化转型是企业的必答题 1.1 解决时代难题&#xff1a;“鲍莫尔成本病” “体验变流量&#xff0c;流量变收入”是其常见的商业模式。数字化平台通过“作业即记录、记录及数据”的方式&#xff0c;能给企业带来很多好处&a…...

环形链表 II(JS)

环形链表 II 题目 给定一个链表的头节点 head &#xff0c;返回链表开始入环的第一个节点。 如果链表无环&#xff0c;则返回 null。 如果链表中有某个节点&#xff0c;可以通过连续跟踪 next 指针再次到达&#xff0c;则链表中存在环。 为了表示给定链表中的环&#xff0c;…...

【字节三面】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命令用于在终端输出指定的文本内容或变量值。 基本语法如下&#xff1a; echo [选项] [字符串]常用选项包括&#xff1a; -e&#xff1a;启用特殊字符的解析&#xff0c;例如\n表示换行符…...

HTML基础知识点总结

目录 1.HTML简介 2.HTML基础结构 主要字符&#xff1a; 3.基础知识 &#xff08;一&#xff09;p标签 &#xff08;二&#xff09;hr标签 &#xff08;三&#xff09;尖角号 &#xff08;四&#xff09;版权号 (五)div和span div span (六)列表 &#xff08;1&…...

VS附加到进程调试

操作&#xff1a; 要附加到进程中调试外部可执行文件&#xff0c;您需要使用Visual Studio的“调试附加”功能。以下是附加到进程中调试外部可执行文件的步骤&#xff1a; 打开您要调试的源代码文件或可执行文件。打开Visual Studio。选择“调试”菜单&#xff0c;然后选择“…...

基于深度学习的高精度狗狗检测识别系统(PyTorch+Pyside6+YOLOv5模型)

摘要&#xff1a;基于深度学习的高精度狗狗检测识别系统可用于日常生活中检测与定位120类狗狗目标&#xff0c;利用深度学习算法可实现图片、视频、摄像头等方式的狗狗目标检测识别&#xff0c;另外支持结果可视化与图片或视频检测结果的导出。本系统采用YOLOv5目标检测模型训练…...

从互联网到云时代,Apache RocketMQ 是如何演进的?

作者&#xff1a;隆基 2022 年&#xff0c;RocketMQ 5.0 的正式版发布。相对于 4.0 版本而言&#xff0c;架构走向云原生化&#xff0c;并且覆盖了更多业务场景。 消息队列演进史 操作系统、数据库、中间件是基础软件的三驾马车&#xff0c;而消息队列属于最经典的中间件之一…...

XML (可扩展标记语言)

目录 一、概念 二. 使用&#xff1a; 1. 基本语法&#xff1a; 2. 组成部分&#xff1a; &#xff08;1&#xff09;文档声明 &#xff08;2&#xff09; 指令(了解)&#xff1a;结合css &#xff08;3&#xff09; 标签&#xff1a;标签名称自定义 &#xff08;4&#xff09…...

socket()、bind()、listen()、htons()

socket() socket() 是一个系统调用函数&#xff0c;用于创建一个套接字&#xff08;socket&#xff09;&#xff0c;通过该套接字进行网络通信。在这段代码中&#xff0c;socket() 函数被用于创建一个本地套接字。 具体来说&#xff0c;这是 socket() 在代码中的使用方式&…...

提升开发效率,Lombok的链式编程和构建模式

目录 链式编程 定义 代码示例 ​编辑 Accessors(chaintrue) 开启链式编程 ​编辑 Accessors(chain true,fluent true) 去除set和get 构建模式 定义 代码示例 ​编辑 踩坑 Singular 定义 代码示例 踩坑默认值情况 ​编辑 With 定义 代码示例 链式编程 定义 链…...

DuDuTalk:AI语音工牌如何帮助教培公司高效管理课程顾问团队

近年来&#xff0c;随着人工智能的快速发展&#xff0c;越来越多的公司开始利用AI技术来提高工作效率和管理效果。在教育培训行业中&#xff0c;课程顾问团队的管理对于公司的运营和发展至关重要。 而在实际管理中&#xff0c;受教培人员素质参差不齐&#xff0c;能力差异大&a…...

前端导出带有合并单元格的列表

// 导出async function exportExcel(fileName "共识调整.xlsx") {// 所有数据const exportData await getAllMainData();// 表头内容let fitstTitleList [];const secondTitleList [];allColumns.value.forEach(column > {if (!column.children) {fitstTitleL…...

微信小程序 - 手机震动

一、界面 <button type"primary" bindtap"shortVibrate">短震动</button> <button type"primary" bindtap"longVibrate">长震动</button> 二、js逻辑代码 注&#xff1a;文档 https://developers.weixin.qq…...

视频字幕质量评估的大规模细粒度基准

大家读完觉得有帮助记得关注和点赞&#xff01;&#xff01;&#xff01; 摘要 视频字幕在文本到视频生成任务中起着至关重要的作用&#xff0c;因为它们的质量直接影响所生成视频的语义连贯性和视觉保真度。尽管大型视觉-语言模型&#xff08;VLMs&#xff09;在字幕生成方面…...

三体问题详解

从物理学角度&#xff0c;三体问题之所以不稳定&#xff0c;是因为三个天体在万有引力作用下相互作用&#xff0c;形成一个非线性耦合系统。我们可以从牛顿经典力学出发&#xff0c;列出具体的运动方程&#xff0c;并说明为何这个系统本质上是混沌的&#xff0c;无法得到一般解…...

零基础设计模式——行为型模式 - 责任链模式

第四部分&#xff1a;行为型模式 - 责任链模式 (Chain of Responsibility Pattern) 欢迎来到行为型模式的学习&#xff01;行为型模式关注对象之间的职责分配、算法封装和对象间的交互。我们将学习的第一个行为型模式是责任链模式。 核心思想&#xff1a;使多个对象都有机会处…...

AI书签管理工具开发全记录(十九):嵌入资源处理

1.前言 &#x1f4dd; 在上一篇文章中&#xff0c;我们完成了书签的导入导出功能。本篇文章我们研究如何处理嵌入资源&#xff0c;方便后续将资源打包到一个可执行文件中。 2.embed介绍 &#x1f3af; Go 1.16 引入了革命性的 embed 包&#xff0c;彻底改变了静态资源管理的…...

Pinocchio 库详解及其在足式机器人上的应用

Pinocchio 库详解及其在足式机器人上的应用 Pinocchio (Pinocchio is not only a nose) 是一个开源的 C 库&#xff0c;专门用于快速计算机器人模型的正向运动学、逆向运动学、雅可比矩阵、动力学和动力学导数。它主要关注效率和准确性&#xff0c;并提供了一个通用的框架&…...

Android第十三次面试总结(四大 组件基础)

Activity生命周期和四大启动模式详解 一、Activity 生命周期 Activity 的生命周期由一系列回调方法组成&#xff0c;用于管理其创建、可见性、焦点和销毁过程。以下是核心方法及其调用时机&#xff1a; ​onCreate()​​ ​调用时机​&#xff1a;Activity 首次创建时调用。​…...

(一)单例模式

一、前言 单例模式属于六大创建型模式,即在软件设计过程中,主要关注创建对象的结果,并不关心创建对象的过程及细节。创建型设计模式将类对象的实例化过程进行抽象化接口设计,从而隐藏了类对象的实例是如何被创建的,封装了软件系统使用的具体对象类型。 六大创建型模式包括…...

从面试角度回答Android中ContentProvider启动原理

Android中ContentProvider原理的面试角度解析&#xff0c;分为​​已启动​​和​​未启动​​两种场景&#xff1a; 一、ContentProvider已启动的情况 1. ​​核心流程​​ ​​触发条件​​&#xff1a;当其他组件&#xff08;如Activity、Service&#xff09;通过ContentR…...