大归纳!!教你使用<string.h>的字符函数与字符串函数!!☑

news2025/1/15 19:53:07

这篇博客为你归纳了所有的字符函数和最常用的字符串函数,以及对应的模拟实现!!你可以直接循着目录跳到你需要的段落哦!!😍

目录

字符函数

字符分类

字符判断函数

islower——判断小写字母

isupper——判断大写字母

isalpha——判断英文字母

isspace——判断空白字符

isblank——判断空格字符

isdigit——判断十进制数字

isxdigit——判断十六进制数字

isalnum——判断字母和数字

ispunct——判断标点圆形符号

isgraph——判断圆形字符

isprint——判断可打印的字符

iscntrl——判断控制字符

字符转换函数

toupper——小写字母转大写

tolower——大写字母转小写

字符串函数 

strlen——计算字符串长度

strcpy——复制字符串

strcat——连接字符串

​strcmp——字符串比较

strncpy、strncat、strncmp——限制长度的比较、连接和复制

 strtok——主字符串中提取字符串

strsrt——模式串匹配

strerror——返回错误信息字符串。

memcpy——内存复制

memmove——内存挪移

memset——设置内存

memcmp——以字节为单位比较数据

结语:



字符函数

字符函数分为两类字符判断和字符转换。它们都包含在头文件<ctype.h>中。字符函数都只有一个参数,int c。参数为int,是因为函数要把你传入的字符强制类型转换为整数ASCII码值,通过比较ASCII码来判断字符。

 如:


字符分类

C语言使用ASCII美国信息交换标准代码,ASCII码值一共256个字符。其中,0~127为C标准规定的,最常用的字符ACSII码值。128~256为扩展字符集,而是否支持扩展字符集,取决于平台和编译环境。

下表中,被“X”号标记的,表示对应字符会被该字符函数判断为真。

原表格可打开此链接查看:<cctype> (ctype.h) - C++ Reference (cplusplus.com)(在此网页最下方)

分类简图:

字符判断函数

字符判断函数,用来判断传入的字符是否为期望的字符。

i.字符判断函数的参数范围

参数值的范围为0~255

如果传入了一个数值大于char类型大小范围的整数,程序就会报错!

下面的代码尝试打印出字符函数isspace的返回值,但是报错了,因为a的值超过了0~255的范围。

ii.字符判断函数的返回结果

若是,则返回一个真值(随机非0值

若不是则返回假值(0

islower——判断小写字母

功能:判断是否为小写字母‘ a ’ ~ ‘ z ’。

示例:

char data1 = 'a';
char data2 = '1';
if(islower(data1))
{
    printf("good!\n");
}
else
{
    printf("no!no!no!");
}
if(islower(data2))
{
    printf("good!\n");
}
else
{
    printf("no!no!no!");
}
//输出结果为:
//good!
//no!no!no!

运行结果:

isupper——判断大写字母

功能:判断是否为大写字母‘ A ’ ~ ‘ Z ’。

示例: 

char data1 = 'A';
char data2 = 'a';
if(islower(data1))
{
    printf("good!\n");
}
else
{
    printf("no!no!no!\n");
}
if(islower(data2))
{
    printf("good!\n");
}
else
{
    printf("no!no!no!\n");
}
//输出结果为:
//good!
//no!no!no!

运行结果:

isalpha——判断英文字母

功能:判断是否为英文字母‘ A ’ ~ ‘ Z ’,‘ a ’ ~ ‘ z ’。

示例: 

int main()
{
    char str[20] = {"12abjkAB7890"};
    for (int i = 0; i < 12; i++)
    {
        if (isalpha(str[i]))
        {
            printf("第%d个字符是英文字母符\n", i + 1);
        }
        else
        {
            printf("不是英文字母符\n");
        }
    }
    return 0;
}

运行结果:

isspace——判断空白字符

功能:判断是否为空白符

空白符为:"  "(空格)、" \f "(换页)、" \n "(换行)、" \r "(回车)、" \t "(制表符)、" \v "(垂直制表符)。

示例: 

int main()
{
    char str[10] = { '\n','\t','\v','\r',' ','\f','g' };
    for (int i = 0; i < 7; i++)
    {
        if (isspace(str[i]))
        {
            printf("第%d个字符是空白符\n", i + 1);
        }
        else
        {
            printf("不是空白符\n");
        }
    }
    return 0;
}

运行结果:

isblank——判断空格字符

功能:判断是否为空格字符‘   ’‘ \t ',为空格字符' \t '也是空格字符喔,可以理解为' \t '是若干个  '   '(空格)。

示例: 

int main()
{
    char str[] = {"11  22  \t"};
    int count = 0;
    for (int i = 0; i < 9; i++)
    {
        if (isblank(str[i]))
        {
            count++;
        }
        else
        {
            printf("第%d个字符%c不是空格字符\n", i + 1, str[i]);
        }
    }
    printf("一共有%d个空格字符\n",count);
    return 0;
}

运行结果:

isdigit——判断十进制数字

功能:判断是否为十进制数字符号, ’ 0 ‘ ~ ’ 9 ‘。

示例: 

​
int main()
{
    char str[20] = {"1234jk567890"};
    for (int i = 0; i < 12; i++)
    {
        if (isdigit(str[i]))
        {
            printf("第%d个是字符是十进制数字符\n", i + 1);
        }
        else
        {
            printf("不是数字符\n");
        }
    }
   	return 0;
}

​

运行结果:

isxdigit——判断十六进制数字

功能:判断十六进制数字字符‘ 0 ’ ~ ‘ 9 ’ 、‘ a ’ ~ ‘ f ’、‘ A ’ ~ ‘ F ’。

示例: 

​
int main()
{
    char str[20] = {"12abjKAB7890"};
    for (int i = 0; i < 12; i++)
    {
        if (isxdigit(str[i]))
        {
            printf("第%d个数字是十六进制数字符\n", i + 1);
        }
        else
        {
            printf("不是数字符\n");
        }
    }
   	return 0;
}

​

运行结果:

isalnum——判断字母和数字

功能:判断是否为英文字母或者数字‘ 0 ’ ~ ‘ 9 ’ 、‘ a ’ ~ ‘ z ’、‘ A ’ ~ ‘ Z ’

示例: 

int main()
{
    char str[20] = {"12abjKAB7890_\n"};
    for (int i = 0; i < 12; i++)
    {
        if (isalpha(str[i]))
        {
            printf("第%d个字符是英文字母符或者数字符\n", i + 1);
        }
        else
        {
            printf("啥也不是\n");
        }
    }
    return 0;
}

运行结果:

ispunct——判断标点圆形符号

功能:判断是否为标点圆形符号~ ! @ # $ % ^ & * ( ) _ + = - ` [ ] \ { } | ; ' : " , . / < > ?。

即键盘上除了数字、字母、控制符和空白符之外,所有的英文圆形标点符号。

示例: 

int main()
{
    char str[] = {"https://blog.csdn.net/Elnaij?spm=1000.2115.3001.5343"};
    int count = 0;
    for (int i = 0; i < 53; i++)
    {
        if (ispunct(str[i]))
        {
            count++;
        }
    }
    printf("一共有%d个标点圆形符号\n",count);
    return 0;
}

运行结果:

isgraph——判断圆形字符

功能:判断是否为圆形字符除了空白符控制字符外,其余符号都为圆形字符

示例: 

​int main()
{
    char str[] = {"https://blog.csdn.net/Elnaij?spm=1000.2115.3001.5343  <-very good!"};
    int count = 0;
    for (int i = 0; i < 66; i++)
    {
        if (isgraph(str[i]))
        {
            count++;
        }
        else
        {
            printf("第%d个字符%c不是圆形字符\n", i + 1, str[i]);
        }
    }
    printf("一共有%d个圆形字符\n",count);
    return 0;
}

运行结果:

isprint——判断可打印的字符

功能:判断是否为可打印字符所有的字母、数字、空格(其他空白符可不算喔)英文圆形标点符号都是可打印字符。

示例: 

int main()
{
	char str[] = { "https://blog.csdn.net/Elnaij?spm=1000.2115.3001.5343\t\a\0\n" };
	int count = 0;
	for (int i = 0; i < 56; i++)
	{
		if (isprint(str[i]))
		{
			count++;
		}
		else
		{
			printf("第%d个字符%c不是可打印字符\n", i + 1, str[i]);
		}
	}
	printf("一共有%d个可打印字符\n", count);
	return 0;
}

运行结果:

虽然' \n '' \t '不归类于可打印字符,但作为空白符的效果还是可以输出。

iscntrl——判断控制字符

功能:判断是否为控制字符ASCII码值为0~31以及127的字符都为控制字符,其中包括了除去空格外的其他空白符。

这些空白符都叫做空白格控制字符(White-space Control Code)。

‘ \t ’不属于控制字符,但是属于空白符。

示例: 

int main()
{
    char str[] = { 0,1,2,3,4,5,6,7,8,9,10,11,
        12,13,14,15,16,17,18,19,20,21,22,23,24,
        25,26,27,28,29,30,31,127,48,49,50,77,88,99 };
//赋ASCII码值
    int count = 0;
    for (int i = 0; i < 39; i++)
    {
        if (iscntrl(str[i]))
        {
            count++;
        }
        else
        {
            printf("第%d个字符%c不是控制字符\n", i + 1, str[i]);
        }
    }
    printf("一共有%d个控制符号\n",count);
    return 0;
}

运行结果:


字符转换函数

字符转换函数不像字符判断函数,就算传入的参数不合法也不会报错。对于转换不了的参数,他会放弃转换,返回传入参数的原值。 

toupper——小写字母转大写

功能:将小写字母转换为大写,并返回转换结果。如果传入的不是小写字母,就返回传入的字符。

示例: 

int main()
{
	int a = 300;
	printf("传入的值为%d\n", a);
	printf("转换结果为:%d\n",toupper(a));
	char c = 'f';
	printf("传入的值为%c\n", c);
	printf("转换结果为:%c\n", toupper(c));
	return 0;
}

运行结果:

tolower——大写字母转小写

功能:将大写字母转为小写,并返回转换结果。如果传入的不是小写字母,就返回传入的字符。

示例: 

int main()
{
	int a = 300;
	printf("传入的值为:%d\n", a);
	printf("转换结果为:%d\n",tolower(a));
	char c = 'F';
	printf("传入的值为:%c\n", c);
	printf("转换结果为:%c\n", tolower(c));
	return 0;
}

运行结果:



字符串函数 

字符串函数,可按照功能分为这5类:复制函数、连接函数、对比函数、查找函数和其他类型

字符串函数都包含在头文件<string.h>中,都能对字符串进行操作。

以下函数按照使用的频率的顺序来介绍,就不按分类来介绍了。

strlen——计算字符串长度

定义:size_t strlen ( const char * str );

功能:传入一个字符串,计算该字符串长度。该函数以字符串的第一个‘ \0 '之前的元素个数是作为字符串长度返回,因此,它会一直计数,直到遇到' \0 '才会停止计数

!!注意!!

若字符串内没有' \0 ',他会继续越界访问字符串之外的内存来找' \0 ',且程序是不会报错。已知,未开辟空间内的数据为随机值,所以出现0值(即‘ \0 ’)也是随机的,导致它返回的长度也会是个随机值这种属于危险操作,使得程序不可控

(对于这种错误,VS编译器会报警告。)

示例:

int main()
{
	char str[] = "I am a handsome guy";
	char arr[5] = { 'a','b','c','d','e' };
	printf("字符串str的长度为:%zd\n字符串arr的长度为:%zd", strlen(str), strlen(arr));
	return 0;
}

运行结果(及错误示例——arr没有' \0 '):

strcpy——复制字符串

定义:char * strcpy ( char * destination, const char * source );

功能:将source源字符串拷贝到destination目标串中,从源字符串头开始复制,从目标字符串头开始拷贝。(' \0 '也会拷贝进去喔!)

!!注意!!

①源字符串内必须要有 ’ \0 '。因为该函数复制停止的条件是遇到’ \0 ',如果没有,就会越界,一直复制直到找到0值(即 ' \0 ')。这属于危险操作,会使得程序不可控,同上strlen函数。

②目标字符串要有足够的空间接受源字符串的复制,多出来的字符仍然会越界赋值。同样是危险的操作。

示例:

int main()
{
	char str[] = "I am a handsome guy";
	char arr[] ="abcedf";
	printf("源字符串为:%s\n目标字符串为:%s\n", arr, str);
	strcpy(str, arr);
	printf("拷贝结果为:%s\n", str);
	return 0;
}

运行结果:

错误示例1(arr没有' \0 '):

错误示例2(目标字符串空间不足,这种情况会引发异常,直接报错,程序停止运行):

strcat——连接字符串

定义:char * strcat ( char * destination, const char * source );

功能:将源字符串source连接到目标字符串末尾连接时会覆盖掉目标字符串destination末尾的    ' \0 '。(实际上是将源字符串拷贝到目标字符串的末尾,就像两个字符串连接起来一样)

!!注意!!

①传入的两个字符串都要有' \0 ',一个让函数找到目标字符串的末尾,即连接位置;另一个让函数找到源字符串的末尾,即停止拷贝处。

②同样的,目标空间要足够大,不然会越界。

③不可以自己连接自己,不然拷贝的时候会把原来的' \0 '覆盖掉,函数找不到' \0 ',拷贝就停不下来了。

原本是这样:

连接一个字符过去变成这样: 

此时字符串里已经没有了' \0 ',造成了源字符串和目标字符串都没有' \0 '的局面,程序无法停止,最终导致越界(vs会让这样的死循环停止,但是还是会产生奇怪的结果,所以还是不要这么做了)

示例:

int main()
{
	char str[30] = "I am a ";
	char arr[] = "handsome guy";
	printf("源字符串为:%s\n目标字符串为:%s\n", arr, str);
	strcat(str, arr);
	printf("连接结果为:%s\n", str);
	return 0;
}

运行结果:

错误示例1(源字符串或者目标字符串没有' \0 ',在找字符串的末尾时导致越界

错误示例2(str空间不足,虽然多出来的字符串是复制过去了,但是是复制在了未开辟的空间里,导致%s打印时,str数组没有' \0 '只能越界访问,最终程序崩溃):

错误示例3(自己连接自己,函数找不到 ' \0 ',导致越界访问):

 strcmp——字符串比较

定义:int strcmp ( const char * str1, const char * str2 );

功能:比较两个字符串是否相同

若相同返回 0;否则返回其他数。

该函数将两个字符串的字符一个一个来比较直到遇到' \0 ',或者两字符不同为之。之后,返回当前两个字符的ASCII码差值(str1的字符 - str2的字符)。因此,两个相同的字符串,长度相同,' \0 '在同一位置。' \0 ' - ' \0 '结果就为0。

!!注意!!

要比较的两个字符串都要有’ \0 ',不然函数不知道什么时候停止比较,返回结果。

示例:

int main()
{
	char arr1[] = "def";
	char arr2[] = "def";
	char arr3[] = "defg";
	printf("arr1与arr2的比较结果为:%d\n", strcmp(arr1, arr2));
	printf("arr1与arr3的比较结果为:%d\n", strcmp(arr1,arr3));
	return 0;
}

运行结果:

​​​​​​​​​​​​​​​​​​​​​

错误示例(其中一个甚至两个字符串中都没有' \0 ',返回的结果是错误的):

strncpy、strncat、strncmp——限制长度的比较、连接和复制

它们的功能与前三者对应。strcpy——strncpy,strcat——strncat,strcmp——strncmp

唯一的差别是它们比前者都多了一个参数,size_t num,作用是限制操作的个数(对应的就是限制比较字符个数,限制连接时拷贝的字符个数,限制复制个数)。

它们操作停止的标准不只是依照' \0 '了,还要看操作字符个数num了。这样一来多了个限制条件,能让操作更灵活。

!!注意!!

当num的值超过了字符串的长度时,可能会导致越界访问喔(其他注意事项同前三者)!

示例:​​​​​​​​​​​​​​​​​​​

 strtok——主字符串中提取字符串

定义:char * strtok ( char * str, const char * delimiters );

示例:

int main()
{
    char str[] = "- This, a sample string.";
    char* pch;
    printf("Splitting string \"%s\" into tokens:\n", str);
    pch = strtok(str, ",-. ");
    while (pch != NULL)
    {
        printf("%s\n", pch);
        pch = strtok(NULL, ",-. ");
    }
    return 0;
}

由于这个函数的功能复杂,直接上图!

③在下一次使用时:

若传入的主字符串str不为NULL,则运行逻辑同上;

若传入的主字符串str为NULL,则上次运行创建的全局字符指针变量充当str

运行结果:

通过多次使用strtok函数,实现将主字符串分割后提取小字符串。

最后主字符串str会变成:

!!注意!!

同样的,主字符串要有' \0 '。函数strtok找目标字符的停止条件是找到目标字符或者' \0 ',没有' \0 '可能会造成越界访问。 

strsrt——模式串匹配

定义:const char * strstr ( const char * str1, const char * str2 );

功能:在串str1里找串str2,若找到,返回串str1内的str2的起始位置

如str1为abcde,str2为cd,则返回str1中字符c的地址。

示例:

#include <stdio.h>
#include <string.h>

int main ()
{
  char str[] ="This is a simple string";
  char * pch;
  pch = strstr (str,"simple");
  if (pch != NULL)
    strncpy (pch,"sample",6);
  puts (str);
  return 0;
}

程序中,通过strstr找到了主串里simple的位置,然后用strncpy把simple改成了sample。 

运行结果:

!!注意!!

str1和str2都要有' \0 ',不然同样会在匹配时因为找不到' \0 '而停不下来,导致越界访问。

strerror——返回错误信息字符串。

定义:char * strerror ( int errnum );

功能:根据传入的错误码,返回对应的错误信息字符串

错误码errno每一个C程序运行时都会自行产生一个全局整型变量errno记录错误码。想要访问程序的错误码errno,就要包含头文件<errno.h>

每一个错误码对应一条错误信息字符串,而这些字符串,在内存中都有地址。

(PS:在vs2022上,错误码的范围是0~42,若传入其他数字,会输出Unknown error,即未知的错误)

示例:

#include <stdio.h>
#include <string.h>

int main()
{
    char* str = NULL;
    for (int i = 0; i < 21; i++)
    {
        str = strerror(i);
        printf("错误码:%d—%s\n", i, str);
    }
    return 0;
}

该程序将错误码为0~20的错误信息都进行打印。

运行结果:

由图可知,程序没有出错,则错误码为0

效果类似perror,不过perror可以自行获取错误码并自行打印错误信息,没有返回值。

memcpy——内存复制

定义:void * memcpy ( void * destination, const void * source, size_t num );

功能:将source中num个字节的内存数据复制到destination中。memcpy可以满足字符串复制strncpy的功能,也可以满足对其他类型数组之间的复制。

示例:

int main()
{
    char str[] = "abcedfg";
    char arr[] = "12345";
    memcpy(str, arr, 6);
    printf(str);
    return 0;
}

运行结果:

运行memcpy后,str在内存中:

!!注意!!

①目标内存和源内存的大小都要 >= 复制字节数num,否则会越界。

②复制什么时候结束,只看复制的字节数达到num了没有,不关注' \0 '

③复制时,目标空间和源空间不可以重叠,不然会产生奇怪的结果(这一点产生的问题在VS的编译环境上被规避了,让其功能与memmove变得一模一样,即使重叠也不会有事,其他编译器不确定)。

memmove——内存挪移

这里不过多介绍,功能和定义都与memcpy相同,但是memmove在任何编译环境下都可以对重叠内存空间进行复制

memset——设置内存

定义:void * memset ( void * ptr, int value, size_t num );

功能:将目标内存空间ptr中的前num个字节的值按value进行设置

示例:

int main()
{
    char str[] = { 0,0,0,0,0,0,0,0,0,0,0 };
    memset(str, '6', 10);
    printf(str);
    return 0;
}

程序把字符全为' \0 '的字符串str中前10个字符设置为字符6,并输出。

运行结果:

!!注意!!

①设置内存的字节数num要 <= 目标空间的大小,不然会发生越界。

②该函数设置值得空间单位为1byte,但value为int类型,因此传入函数后会被截断,只要一个字节的数据,实际上设置的值大小范围为0x00~0xFF

memcmp——以字节为单位比较数据

定义:int memcmp ( const void * ptr1, const void * ptr2, size_t num );

功能:从ptr1和ptr2开始,以字节byte为单位比较num个字节byte内存中的数据

示例:

int main()
{
    int arr1[] = { 1,2,3,4,5,6,7,8,9,0 };
    int arr2[] = { 1,2,3,4,5,6,7 };
    int arr3[] = { 1,2,3,4,5,6,7,8,9,9 };
    printf("arr1和arr2比较前6个数字的结果为:%d\n", memcmp(arr1, arr2, sizeof(int) * 6));
    printf("arr1和arr3比较前10个数字的结果为:%d\n", memcmp(arr1, arr3, sizeof(int) * 10));
    return 0;
}

 运行结果:

memcmp返回值的结果和strcmp返回值逻辑一致。 

!!注意!!比较字节数num要<=ptr1和ptr2的空间,不然会将内存中的随机值进行比较。vs也会报警告:读取无效数据。

结语:

关于字符函数和字符串函数的内容已经圆满完成!!

有什么疑问和困惑欢迎来评论区留言!!🤩我一定尽力及时解答!!制作不易,求关注!!求点赞!!之后还会有更多有用的干货博客会发出哦!!欢迎做客我的主页!!❤❤Elnaij-CSDN博客❤❤

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

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

相关文章

上位机图像处理和嵌入式模块部署(f407 mcu中的udp server开发)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】 既然lwip已经port到407上面了&#xff0c;接下来其实就可以做一些测试了。本身lwip支持tcp、udp&#xff0c;也支持client和server&#xff0c;既然…

Qt信号槽与函数直接调用性能对比

1. 测试方法 定义一个类Recv&#xff0c;其中包含一个成员变量num和一个成员函数add()&#xff0c;add()实现num的递增。 另一个类Send通过信号槽或直接调用的方法调用Recv的add函数。 单独开一个线程Watcher&#xff0c;每秒计算num变量的增长数值&#xff0c;作为add函数被调…

STL中vector动态二维数组理解(杨辉三角)

题目链接&#xff1a;118.杨辉三角 题目描述&#xff1a; 给定一个非负整数 numRows&#xff0c;生成「杨辉三角」的前 numRows 行。 在「杨辉三角」中&#xff0c;每个数是它左上方和右上方的数的和。 题目指要&#xff1a; 本题的主要目的是理解vector<vector<int&…

编译原理总结

编译器构成 1. 前端分析部分 1.1 词法分析 确定词性&#xff0c;输出为token序列 1.2 语法分析 识别短语 1.3 语义分析 分析短语在句子中的成分 IR中间代码生成 2. 机器无关代码优化 3. 后端综合部分 目标代码生成 机器相关代码优化 4. 其他 全局信息表 异常输出

电影推荐系统配置运行

电影推荐系统配置运行 代码地址项目介绍&#xff08;引自原文&#xff09; 环境创建新环境激活环境安装包创建管理员用户(可选)启动 代码地址 movie 项目介绍&#xff08;引自原文&#xff09; 本推荐系统采用的是分层模型设计思想&#xff0c;第一层为前端页面模型设计&…

2024.6.5

1、react原理学习&#xff0c; hook、fiber 2、瀑布流组件完善 3、代码随想录二刷

【雷丰阳-谷粒商城 】【分布式基础篇-全栈开发篇】【06】【商品服务】接口文档地址_三级分类_SPU_SKU

持续学习&持续更新中… 学习态度&#xff1a;守破离 【雷丰阳-谷粒商城 】【分布式基础篇-全栈开发篇】【06】【商品服务】接口文档地址_三级分类_SPU_SKU 接口文档地址三级分类效果图建表后台组建数据的树形结构在人人(后台管理系统)中实现管理商品的三级分类路径规则使用…

DRIVEN|15分的CNN+LightGBM怎么做特征分类,适用于转录组

说在前面 今天分享一篇做深度学习模型的文章&#xff0c;这是一篇软硬结合的研究&#xff0c;排除转换实体产品&#xff0c;我们做生信基础研究的可以学习模仿这个算法&#xff0c;适用且不局限于临床资料&#xff0c;转录组数据&#xff0c;GWAS数据。 今天给大家分享的一篇文…

创新入门|营销中的视频内容:不可或缺的策略

视频在营销中日益重要。你是否也发现,视频内容最近似乎无处不在?它占据着社交媒体的推文、网站首页,甚至电子邮件中的位置。事实上,并不是你一个人有这样的感受。在过去十年中,视频作为一种营销手段日益成熟和强大。这是因为,人类天生就是视觉动物。我们大脑处理视觉信息的速度…

补上缺失的一环----一种数据库系统主动对外推送表的增删改实时变动数据的实践

在实践中&#xff0c;一些应用程序或模块需要实时获取某些数据库表的增删改变动数据。 对此需求&#xff0c;常见的方案有: 1、应用程序通过轮循查询数据库方式获取数据库表的增删改变动数据. 2、应用程序在把数据写入数据库表之前&#xff0c;通过事件方式向外通知数据库表的增…

安徽某高校数据挖掘作业6

1 根据附件中year文件&#xff0c;编辑Python程序绘制年销售总额分布条形图和年净利润分布条形图&#xff0c;附Python程序和图像。 2 根据附件中quarter和quarter_b文件&#xff0c;编辑Python程序绘制2018—2020年销售额和净利润折线图&#xff0c;附Python程序和图像。 3 …

城市之旅:使用 LLM 和 Elasticsearch 简化地理空间搜索(二)

我们在之前的文章 “城市之旅&#xff1a;使用 LLM 和 Elasticsearch 简化地理空间搜索&#xff08;一&#xff09;”&#xff0c;在今天的练习中&#xff0c;我将使用本地部署来做那里面的 Jupyter notebook。 安装 Elasticsearch 及 Kibana 如果你还没有安装好自己的 Elasti…

C#-foreach循环语句

foreach循环语句 语法&#xff1a; foreach(数据类型 变量名 in 数组或集合对象) { 语句块; } foreach 会在每次循环的过程中&#xff0c;依次从数组或集合对象中取出一个新的元素放foreach( )里定义的变量中&#xff0c;直到所有元素都成功取出后退出循环。 foreach循环…

[AI资讯·0605] GLM-4系列开源模型,OpenAI安全疑云,ARM推出终端计算子系统,猿辅导大模型备案……

AI资讯 1毛钱1百万token&#xff0c;写2遍红楼梦&#xff01;国产大模型下一步还想卷什么&#xff1f;AI「末日」突然来临&#xff0c;公司同事集体变蠢&#xff01;只因四大聊天机器人同时宕机OpenAI员工们开始反抗了&#xff01;AI手机PC大爆发&#xff0c;Arm从软硬件到生态…

搭建大型分布式服务(三十九)SpringBoot 整合多个kafka数据源-支持Aware模式

系列文章目录 文章目录 系列文章目录前言一、本文要点二、开发环境三、原项目四、修改项目五、测试一下五、小结 前言 本插件稳定运行上百个kafka项目&#xff0c;每天处理上亿级的数据的精简小插件&#xff0c;快速上手。 <dependency><groupId>io.github.vipjo…

【成品设计】基于物联网技术的养老院老人健康监控系统的设计与实现

《基于物联网技术的养老院老人健康监控系统的设计与实现》 老年人监护系统的核心任务是分析老年人在日常生活中是否存在意外事件和异常行为并提供相关帮助。正确分析出老年人的突发意外和行为异常&#xff0c;不仅可以有效地降低老年人因意外事故造成的生命风险&#xff0c;还…

【一步一步了解Java系列】:重磅多态

看到这句话的时候证明&#xff1a;此刻你我都在努力 加油陌生人 个人主页&#xff1a;Gu Gu Study专栏&#xff1a;一步一步了解Java 喜欢的一句话&#xff1a; 常常会回顾努力的自己&#xff0c;所以要为自己的努力留下足迹 喜欢的话可以点个赞谢谢了。 作者&#xff1a;小闭…

Vue的APP实现下载文件功能,并将文件保存到手机中

Vue的APP实现下载文件功能&#xff0c;并将文件保存到手机中 文字说明后台核心代码前台核心代码运行截图项目链接 文字说明 本文介绍Vue实现的APP&#xff0c;将文件下载并保存到手机中&#xff0c;为系统提供导出功能&#xff1b;同时支持导入&#xff0c;即选择本地的文件后&…

C++STL---list知识汇总

前言 学习完list&#xff0c;我们会对STL中的迭代器有进一步的认识。list底层有很多经典的东西&#xff0c;尤其是他的迭代器。而list的结构是一个带头双向循环链表。 list没有reserve和resize&#xff0c;因为它底层不是连续的空间&#xff0c;它是用时随时申请&#xff0c;…

18.使用__asm实现调用hp减伤害

上一个内容&#xff1a;17.调用游戏本身的hp减伤害函数实现秒杀游戏角色 17.调用游戏本身的hp减伤害函数实现秒杀游戏角色 以它的代码为基础进行修改 首先禁用安全检查 然后再把优化关闭 编译代码时使用Release方式&#xff0c;debug方式会加一些代码&#xff0c;如果这些代码…