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

重庆网站建设的价格/seo优化的主要任务包括

重庆网站建设的价格,seo优化的主要任务包括,怎么看一个网站是由哪个公司做的,wordpress做导航网站目录 一、字符串的引入和注意事项 1.1 字符串定义的几种方式: 1.2 定义字符串的方法一和方法二的区别: 1.3 字符串输出的几种方式: 1.3.1 循环下标法遍历输出字符串: 1.3.2 转义字符%s输出字符串: 1.3.3 使用puts函…

目录

一、字符串的引入和注意事项

1.1 字符串定义的几种方式:

1.2 定义字符串的方法一和方法二的区别:

1.3 字符串输出的几种方式:

        1.3.1 循环下标法遍历输出字符串:

        1.3.2 转义字符%s输出字符串:

        1.3.3 使用puts函数输出字符串:

1.4 字符串初始总结:

二、字符串的内存存放方式及结束标志

2.1 回忆如何计算数组的大小及数组元素的个数:

2.2 字符串和字符数组的存储方式区别:

三、sizeof和strlen区别很重要

3.1 sizeof和strlen分别计算字符串变量:

3.2 sizeof和strlen分别计算字符串常量:

四、malloc动态开辟内存空间

4.1 malloc动态开辟内存空间函数引入:

        4.1.1 malloc函数认知和函数原型:

        4.1.2 使用malloc动态开辟一快内存空间:

4.2 strcpy函数引入:

        4.2.1 strcpy函数原型:

        4.2.2 strcpy函数应用:

4.3 free函数引入:

        4.3.1 free函数原型和作用:

        4.3.2 free函数应用:

4.3 realloc扩容函数引入:

        4.3.1 为什么要用realloc扩容函数:

        4.3.2 realloc函数原型和作用:

        4.3.3 realloc函数应用:

4.4 memset清理内存空间函数引入:

        4.4.1 memset函数原型:

        4.4.2 memset函数应用:

4.5 malloc动态开辟内存总结:

五、字符串常用API

5.1 输出字符串:

        5.1.1 puts函数输出字符串:

        5.1.2 使用printf函数输出字符串:

5.2 输入字符串:

        5.2.1 使用scanf函数输入字符串:

        5.2.2 gets函数输入字符串:

5.3 字符串拷贝函数strcpy:

        5.3.1 strcpy函数原型:

        5.3.2 字符串拷贝函数strcpy应用:

        5.3.3 自己实现字符串拷贝函数strcpy:

5.4 strncpy部分字符拷贝函数:

        5.4.1 strncpy函数原型和作用:

        5.4.2 strncpy函数应用:

        5.4.3 自己实现部分字符串拷贝函数strncpy:

5.5 assert断言函数:

        5.5.1 assert断言函数认知:

        5.5.2 assert断言函数原型:

        5.5.3 assert断言函数应用:

5.6 strcat字符串拼接函数:

        5.6.1 strcat函数原型和作用:

        5.6.2 strcat字符串拼接函数应用:

        5.6.3 自己实现strcat字符串拼接函数:

5.7 strcmp字符串比较函数:

        5.7.1 strcmp函数原型和作用:

        5.7.2 strcmp函数应用:

        5.7.3 自己实现字符串比较函数strcmp:

5.8 strncmp字符串比较函数:

        5.8.1 strncmp函数原型和作用:

        5.8.2 strncmp函数应用:


一、字符串的引入和注意事项

  • 字符串就是字符数组,虽然我不想这样说:

1.1 字符串定义的几种方式:

  • 我们都知道整型数组该如何定义:

#include <stdio.h>int main()
{int arr[] = {1,2,3,4,5};	//定义一个整型数组for(int i=0; i<5; i++){printf("%d ",arr[i]);}return 0;
}
/*
E:\code\一阶段C语言\第七章_字符串>gcc demo.cE:\code\一阶段C语言\第七章_字符串>a.exe
1 2 3 4 5
*/
  • 那字符串和整型数组一个道理:

#include <stdio.h>int main()
{char cdata[] = {'h','e','l','l','o'};	//定义一个字符数组for(int i=0; i<5; i++){printf("%c",cdata[i]);}return 0;
}
/*
E:\code\一阶段C语言\第七章_字符串>gcc demo.cE:\code\一阶段C语言\第七章_字符串>a.exe
hello
*/
  • 上面这种字符串定义方式并不好用,太麻烦了,那该如何改进呢?

  • 定义字符串方法一

#include <stdio.h>int main()
{char cdata[] = "hello";		//定义一个字符串方法一for(int i=0; i<5; i++){printf("%c",cdata[i]);}return 0;
}
/*
E:\code\一阶段C语言\第七章_字符串>gcc demo.cE:\code\一阶段C语言\第七章_字符串>a.exe
hello
*/
  • 一般情况下我们这样定义一个字符串:

  • 定义字符串方法二

/*字符串的名字是一个地址,是字符串的首地址,我们可以定义一个指针来保存字符串的首地址
*/
#include <stdio.h>int main()
{char *pcdata = "hello";		//定义一个字符串方法二for(int i=0; i<5; i++){printf("%c",*(pcdata+i));}return 0;
}
/*
E:\code\一阶段C语言\第七章_字符串>gcc demo.cE:\code\一阶段C语言\第七章_字符串>a.exe
hello
*/

1.2 定义字符串的方法一和方法二的区别:

  • 方法一是字符串变量,里面的每一个字符都是可以修改的

#include <stdio.h>int main()
{char cdata[] = "hello";printf("修改前:\n");for(int i=0; i<5; i++){printf("%c",cdata[i]);	//字符串修改前打印输出}cdata[3] = 'm';printf("\n修改后:\n");for(int i=0; i<5; i++){printf("%c",cdata[i]);	//字符串修改后打印输出}return 0;
}
/*
E:\code\一阶段C语言\第七章_字符串>gcc demo.cE:\code\一阶段C语言\第七章_字符串>a.exe
修改前:
hello
修改后:
helmo
*/
  • 方法二是字符串常量,里面的每一个字符不允许被修改

#include <stdio.h>int main()
{char *pcdata = "hello";printf("修改前:\n");for(int i=0; i<5; i++){printf("%c",*(pcdata+i));}*pcdata = 'm';					printf("修改后:\n");for(int i=0; i<5; i++){printf("%c",*(pcdata+i));}return 0;
}
/*
E:\code\一阶段C语言\第七章_字符串>gcc demo.cE:\code\一阶段C语言\第七章_字符串>a.exe
修改前:
hello
*/
  • 我们可以看到程序编译没有问题,但是程序执行到第12行的时候卡了一下就退出了,其实这里是发生了一个段错误:

/*
E:\code\一阶段C语言\第七章_字符串>gcc demo.c -gE:\code\一阶段C语言\第七章_字符串>gdb a.exe
GNU gdb (GDB) 8.1
Copyright (C) 2018 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.  Type "show copying"
and "show warranty" for details.
This GDB was configured as "x86_64-w64-mingw32".
Type "show configuration" for configuration details.
For bug reporting instructions, please see:
<http://www.gnu.org/software/gdb/bugs/>.
Find the GDB manual and other documentation resources online at:
<http://www.gnu.org/software/gdb/documentation/>.
For help, type "help".
Type "apropos word" to search for commands related to "word"...
Reading symbols from a.exe...done.
(gdb) r
Starting program: E:\code\C\_\a.exe
[New Thread 107412.0x19efc]
[New Thread 107412.0x18a5c]
修改前:
hello
Thread 1 received signal SIGSEGV, Segmentation fault.
0x00000000004015a4 in main () at demo.c:12
12              *pcdata = 'm';
(gdb)
*/

1.3 字符串输出的几种方式:

1.3.1 循环下标法遍历输出字符串:

  • 上面我们对字符串的遍历输出全部都是使用:循环访问下标的方式输出的,但是这种方法太蠢了:

#include <stdio.h>int main()
{char cdata[] = "hello";char *pcdata = "hello";for(int i=0; i<5; i++){printf("%c",cdata[i]);}putchar('\n');for(int i=0; i<5; i++){printf("%c",*(pcdata+i));}return 0;
}
/*
E:\code\一阶段C语言\第七章_字符串>gcc demo.c -gE:\code\一阶段C语言\第七章_字符串>a.exe
hello
hello
*/

1.3.2 转义字符%s输出字符串:

/*在printf的时候使用转义字符%s输出字符串
*/
#include <stdio.h>int main()
{char cdata[] = "hello";char *pcdata = "hello";printf("%s\n",cdata);	//这里要的是一个地址printf("%s",pcdata);return 0;
}
/*
E:\code\一阶段C语言\第七章_字符串>gcc demo.c -gE:\code\一阶段C语言\第七章_字符串>a.exe
hello
hello
*/

1.3.3 使用puts函数输出字符串:

/*使用puts函数也可以输出字符串,puts的意思本来就是:Output String
*/
#include <stdio.h>int main()
{char cdata[] = "hello";char *pcdata = "hello";puts(cdata);		//puts后面跟的是一个地址puts(pcdata);		//puts后面跟的是一个地址return 0;
}
/*
E:\code\一阶段C语言\第七章_字符串>gcc demo.c -gE:\code\一阶段C语言\第七章_字符串>a.exe
hello
hello
*/

1.4 字符串初始总结:

  • 定义字符串的几种方式:

/*定义一个字符串的几种方式:
*/
char cdata[] = {'h','e','l','l','o'};
char cdata2[] = "hello";
char *pcdata = "hello";
  • 输出字符串的几种方式:

/*循环遍历输出字符串,蠢*/
char cdata[] = "hello";for(int i=0; i<5; i++){printf("%c",cdata[i]);
}
/*转义字符%s输出字符串*/
char cdata[] = "hello";printf("%s",cdata);
/*使用puts函数输出字符串*/
char *pcdata = "hello";puts(pcdata);
  • 字符串变量和字符串常量区别:

char cdata[] = "hello";
/*字符串变量里面的每一个字符是可以修改的*/char *pcdata = "hello";
/*字符串常量里面的每一个字符不允许修改*/
  • 注意对指针的操作:

  • 指针可以保存地址,对字符串常量的的地址空间访问,但对野指针的内存空间操作不行

#include <stdio.h>int main()
{char *p;	//野指针,并没有明确的内存指向,危险!⚠*p = 'c';printf("%c",*p);return 0;
}
/*
E:\code\一阶段C语言\第七章_字符串>gcc demo.c -gE:\code\一阶段C语言\第七章_字符串>gdb a.exe
GNU gdb (GDB) 8.1
Copyright (C) 2018 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.  Type "show copying"
and "show warranty" for details.
This GDB was configured as "x86_64-w64-mingw32".
Type "show configuration" for configuration details.
For bug reporting instructions, please see:
<http://www.gnu.org/software/gdb/bugs/>.
Find the GDB manual and other documentation resources online at:
<http://www.gnu.org/software/gdb/documentation/>.
For help, type "help".
Type "apropos word" to search for commands related to "word"...
Reading symbols from a.exe...done.
(gdb) r
Starting program: E:\code\C\_\a.exe
[New Thread 108284.0x1a868]
[New Thread 108284.0x1aac4]Thread 1 received signal SIGSEGV, Segmentation fault.
0x0000000000401561 in main () at demo.c:7
7               *p = 'c';
*/

二、字符串的内存存放方式及结束标志

2.1 回忆如何计算数组的大小及数组元素的个数:

/*计算一个数组的大小和数组元素的个数
*/
#include <stdio.h>int main()
{int data[] = {1,2,3,4,5};printf("数组的大小是:%d\n",sizeof(data));int len = sizeof(data) / sizeof(data[0]);printf("数组元素个数len = %d\n",len);return 0;
}
/*
E:\code\一阶段C语言\第七章_字符串>gcc demo_len.cE:\code\一阶段C语言\第七章_字符串>a.exe
数组的大小是:20
数组元素个数len = 5
*/

2.2 字符串和字符数组的存储方式区别:

/*分别计算字符数组和字符串,观察有什么区别:
*/
#include <stdio.h>int main()
{char cdata[5] = {'h','e','l','l','o'};	//定义一个字符数组char cdata2[] = "hello";				//定义一个字符串int len = sizeof(cdata) / sizeof(cdata[0]);printf("len = %d\n",len);len = sizeof(cdata2) / sizeof(cdata2[0]);printf("len = %d\n",len);return 0;
}
/*
E:\code\一阶段C语言\第七章_字符串>gcc demo_len.cE:\code\一阶段C语言\第七章_字符串>a.exe
len = 5
len = 6
*/
  • 我们可以看到:字符数组的长度是5,而字符串的长度是6

  • 是因为字符串后面多出了一个'\0','\0'代表字符串的结束标志

/*在定义或者声明字符数组的时候,需要注意在后面加上一个'\0',如果编译器优化不到位就会出现乱码的情况!⚠
*/
#include <stdio.h>int main()
{char cdata[6] = {'h','e','l','l','o','\0'};return 0;
}

/*字符串的结束标志'\0',这个东西非常重要,比如在后面的关于字符串的各种API里面都是在找'\0'*/
#include <string.h>

三、sizeof和strlen区别很重要

3.1 sizeof和strlen分别计算字符串变量:

#include <stdio.h>
#include <string.h>int main()
{char cdata[] = "hello";printf("sizeof :%d\n",sizeof(cdata));	//sizeof计算字符串的所有字符printf("strlen :%d\n",strlen(cdata));	//strlen计算字符串的有效字符return 0;
}
/*
E:\code\一阶段C语言\第七章_字符串>gcc demo_sizeof_strlen.cE:\code\一阶段C语言\第七章_字符串>a.exe
sizeof :6
strlen :5
*/
  • 我们看到sizeof的时候是6,是因为字符串的结束标志'\0'也是一个字符

  • 而strlen的时候是5,是因为strlen是计算字符串的有效字符的长度

/*我们知道sizeof是计算整个字符串的大小,那我把字符串改成128,那sizeof的结果是多少呢?
*/
#include <stdio.h>
#include <string.h>int main()
{char cdata[128] = "hello";printf("sizeof :%d\n",sizeof(cdata));printf("strlen :%d\n",strlen(cdata));return 0;
}
/*
E:\code\一阶段C语言\第七章_字符串>gcc demo_sizeof_strlen.cE:\code\一阶段C语言\第七章_字符串>a.exe
sizeof :128
strlen :5
*/
  • 可以看到sizeof是128,sizeof是计算整个字符串的大小,除了有效字符外,其他的系统会自动补'\0'

  • 该用sizeof的时候用sizeof,该用strlen的时候用strlen,如果该用sizeof的时候用了strlen那么数据就不对了!

3.2 sizeof和strlen分别计算字符串常量:

#include <stdio.h>
#include <string.h>void test()
{}int main()
{void (*ptest)() = test;	//定义一个函数指针变量char *p = "hello";//p是一个char *型,用sizeof来计算的时候,得出的是计算机用多少个个字节来表示一个地址printf("sizeof p     :%d\n",sizeof(p));	printf("sizeof char* :%d\n",sizeof(char *));printf("sizeof int * :%d\n",sizeof(int *));printf("sizeof ptest :%d\n",sizeof(ptest));printf("sizeof char  :%d\n",sizeof(char));printf("strlen p     :%d\n",strlen(p));return 0;
}
/*
E:\code\一阶段C语言\第七章_字符串>gcc demo_sizeof_strlen.cE:\code\一阶段C语言\第七章_字符串>a.exe
sizeof p     :8
sizeof char* :8
sizeof int * :8
sizeof ptest :8
sizeof char  :1
strlen p     :5
*/
  • sizeof字符串常量的时候,表示操作系统用多少个字节来表示一个地址

  • strlen字符串常量的时候,仍然是代表字符串的有效长度

四、malloc动态开辟内存空间

4.1 malloc动态开辟内存空间函数引入:

4.1.1 malloc函数认知和函数原型:

  • 通常我们定义数组或者字符数组的时候就已经把内存地址定好了,例如:

int data[] = {1,2,3,4,5};				//定义一个整型数组
char cdata[] = {'h','e','l','l','o'};	//定义一个字符数组
  • 那么现在我有一个需求:我不希望一开始就耗费这么大的空间,我想按需求开辟内存空间,引入动态开辟内存空间malloc函数

  • malloc函数就是我们在堆上面动态的开辟内存空间,它跟以前我们数组占用的使用的内存空间是不一样的,以前我们数组都是在栈区,那么堆是malloc对应的内存空间

/*malloc函数原型:*/void* malloc(size_t size)
/*分配所需的内存空间,并返回一个指向它的指针*/

4.1.2 使用malloc动态开辟一快内存空间:

/*我们之前写过一个例子,对这个p进行赋值的时候会产生一个段错误,p是一个野指针,对野指针赋值我们会看到犯错,如果不会犯错程序中end会执行,你会看到end根本就不会执行,p没有具体的指向哪个内存空间
*/
#include <stdio.h>int main()
{char *p;	//野指针*p = 'c';puts("end");return 0;
}
/*
E:\code\一阶段C语言\第七章_字符串>gcc demo_malloc.c -gE:\code\一阶段C语言\第七章_字符串>gdb a.exe
GNU gdb (GDB) 8.1
Copyright (C) 2018 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.  Type "show copying"
and "show warranty" for details.
This GDB was configured as "x86_64-w64-mingw32".
Type "show configuration" for configuration details.
For bug reporting instructions, please see:
<http://www.gnu.org/software/gdb/bugs/>.
Find the GDB manual and other documentation resources online at:
<http://www.gnu.org/software/gdb/documentation/>.
For help, type "help".
Type "apropos word" to search for commands related to "word"...
Reading symbols from a.exe...done.
(gdb) r
Starting program: E:\code\C\_\a.exe
[New Thread 107868.0x162c0]
[New Thread 107868.0x1b344]Thread 1 received signal SIGSEGV, Segmentation fault.
0x0000000000401561 in main () at demo_malloc.c:7
7               *p = 'c';
*/
  • 我们使用malloc函数动态开辟内存空间,用p来承接它:

/*malloc动态开辟一块内存空间
*/
#include <stdio.h>
#include <stdlib.h>int main()
{char *p;p = (char *)malloc(1);	//p现在就有了具体的内存指向*p = 'c';printf("%c\n",*p);puts("end");return 0;
}
/*
E:\code\一阶段C语言\第七章_字符串>gcc demo_malloc.c -gE:\code\一阶段C语言\第七章_字符串>a.exe
c
end
*/
  • 现在的p就不是一个野指针了,p有了具体的内存指向

  • 程序中为什么需要将malloc返回的地址强制转换成char *型呢?因为malloc函数返回的地址是一个void *型,如果想用p来承接malloc返回的内存地址的话,必须强制转换成char *型

4.2 strcpy函数引入:

4.2.1 strcpy函数原型:

/*strcpy函数原型:*/
char* strcpy(char *dest, const char *src)
/*字符串拷贝函数strcpy(拷贝到哪里去,从哪里拷贝);
*/

4.2.2 strcpy函数应用:

  • 我们可以开辟一个内存空间,当然也可以开辟多个内存空间

#include <stdio.h>int main()
{char *p;		//野指针p = (char *)malloc(1);*p = 'c';p = (char *)malloc(12);	//开辟12个内存空间return 0;
}
  • 这里开辟了12个内存空间,仍然用p来承接。这个时候就需要往里面放数据了,于是引入一个函数(strcpy字符串拷贝函数)

#include <stdio.h>
#include <stdlib.h>
#include <string.h>int main()
{char *p;		//野指针p = (char *)malloc(1);*p = 'c';p = (char *)malloc(12);strcpy(p,"chenlichen");puts(p);return 0;
}
/*
E:\code\一阶段C语言\第七章_字符串>gcc demo_malloc.c -gE:\code\一阶段C语言\第七章_字符串>a.exe
chenlichen
*/

⚠这边其实存在一个很严重的问题:

  • 刚开始p指向的是你开辟的一个内存空间,但是你又开辟了12字节内存空间也让p指向了它,此时p就会和之前开辟的那一块内存空间断开,并指向新开辟的12字节内存空间,此时那一块和p断开的内存就成了悬挂无用的内存了,已经找不到这个地址了,空闲在这了。像这种空闲在这的内存我们通常需要通过free将其释放

  • 因为malloc它在堆上面开辟内存空间,数组和普通的变量是在栈开辟内存空间,在函数调用结束以后它会清理栈里面的数据(回收内存),那堆只有到程序结束以后内存才会释放(有一个风险,如果你是一个死循环,不断地malloc,有可能会耗尽你计算机上堆的内存资源),所以需要通过free将其释放掉

4.3 free函数引入:

4.3.1 free函数原型和作用:

/*free函数原型:*/
void free(void *ptr);
  • free函数作用释放之前调用calloc,malloc和realloc所分配的内存空间,释放无用内存,防止内存泄漏,防止悬挂指针(悬挂指针是野指针的一种)

4.3.2 free函数应用:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>int main()
{char *p;		//野指针p = (char *)malloc(1);*p = 'c';free(p);				//释放无用内存,放置内存泄露p = NULL;				//尽量不要悬挂指针p = (char *)malloc(12);strcpy(p,"chenlichen");puts(p);return 0;
}
  • free释放掉无用内存后,p重新变成了野指针,一般让p = NULL,尽量不要悬挂指针!

4.3 realloc扩容函数引入:

4.3.1 为什么要用realloc扩容函数:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>int main()
{char *p;				//野指针p = (char *)malloc(12);strcpy(p,"chenlichenshuai123456789987654321");puts(p);return 0;
}
  • 比如说现在有这么多的数据需要放到内存空间中,而上面malloc只开辟了12个字节的内存空间,如果这么多数据需要放到里面的话是不行的,会发生越界,导致程序崩溃,这个时候就可以使用realloc扩容函数来解决

4.3.2 realloc函数原型和作用:

/*realloc函数原型:*/
void* realloc(void *ptr, size_t size);
/*字符串扩容函数realloc(原本扩容地址,要继续增大多少);
*/
  • realloc函数作用:尝试重新调整之前调用malloc和calloc所分配的ptr所指向的内存块大小

4.3.3 realloc函数应用:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>int main()
{char *p;				//野指针p = (char *)malloc(12);printf("扩容前地址:%x\n",p);int len = strlen("chenlichenshuai123456789987654321");//计算字符串的有效字符大小int newLen = len - 12 + 1;		//实际扩容大小 = 总长度 - 原来动态开辟的12个 + 结束标志'\0'realloc(p,newLen);printf("扩容后地址:%x\n",p);strcpy(p,"chenlichenshuai123456789987654321");puts(p);return 0;
}
/*
E:\code\一阶段C语言\第七章_字符串>gcc demo_malloc.cE:\code\一阶段C语言\第七章_字符串>a.exe
扩容前地址:685920
扩容后地址:685920
chenlichenshuai123456789987654321
*/
  • 扩容前和扩容后的地址是一样的

4.4 memset清理内存空间函数引入:

4.4.1 memset函数原型:

/*memset函数原型:*/
void* memset(void *str, int c, size_t n);
/*void* memset(新开辟的内存地址,要初始化的内容,内存大小);
*/

4.4.2 memset函数应用:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>int main()
{char *p;						//野指针p = (char *)malloc(12);memset(p,'\0',12);				//把刚开始动态开辟的内存空间全部初始化成'\0'printf("扩容前地址:%x\n",p);int len = strlen("chenlichenshuai123456789987654321");//计算字符串的有效字符大小int newLen = len - 12 + 1;		//实际扩容大小 = 总长度 - 原来动态开辟的12个 + 结束标志'\0'realloc(p,newLen);printf("扩容后地址:%x\n",p);strcpy(p,"chenlichenshuai123456789987654321");puts(p);return 0;
}
/*
E:\code\一阶段C语言\第七章_字符串>gcc demo_malloc.cE:\code\一阶段C语言\第七章_字符串>a.exe
扩容前地址:685920
扩容后地址:685920
chenlichenshuai123456789987654321
*/

4.5 malloc动态开辟内存总结:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>int main()
{char *p;					//野指针p = (char *)malloc(1);		//现在有了具体的内存指向*p = 'c';printf("%c\n",*p);free(p);					//释放无用内存,放置内存泄漏p = NULL;					//尽量不要悬挂指针p = (char *)malloc(12);		//使用malloc函数动态开辟了12个内存空间用p承接if(p == NULL){				//判断malloc是否动态开辟成功printf("malloc erroe!\n");}memset(p,'\0',12);			//新开辟的内存空间全部初始化成'\0'printf("扩容前地址:%x\n",p);int len = strlen("chenlichenshuai123456789987654321");int newLen = len - 12 + 1;realloc(p,newLen);			//扩容内存printf("扩容后地址:%x\n",p);strcpy(p,"chenlichenshuai123456789987654321");puts(p);return 0;
}
/*
E:\code\一阶段C语言\第七章_字符串>gcc demo_malloc.cE:\code\一阶段C语言\第七章_字符串>a.exe
c
扩容前地址:1b13e0
扩容后地址:1b13e0
chenlichenshuai123456789987654321
*/

五、字符串常用API

5.1 输出字符串:

5.1.1 puts函数输出字符串:

/*使用puts函数输出字符串
*/
#include <stdio.h>int main()
{char cdata[] = "chenlichen shaui";char *pchar  = "chenlichen shuai";puts(cdata);puts(pchar);return 0;
}
/*
E:\code\一阶段C语言\第七章_字符串>gcc demo_puts_gets.cE:\code\一阶段C语言\第七章_字符串>a.exe
chenlichen shaui
chenlichen shuai
*/

5.1.2 使用printf函数输出字符串:

/*在printf函数的时候利用转义字符%s输出字符串
*/
#include <stdio.h>int main()
{char cdata[] = "chenlichen shuai";char *pchar  = "chenlichen shaui";printf("%s\n",cdata);printf("%s\n",pchar);return 0;
}
/*
E:\code\一阶段C语言\第七章_字符串>gcc demo_puts_gets.cE:\code\一阶段C语言\第七章_字符串>a.exe
chenlichen shuai
chenlichen shaui
*/

5.2 输入字符串:

5.2.1 使用scanf函数输入字符串:

/*在scanf函数的时候利用转义字符%s输入字符串
*/
#include <stdio.h>int main()
{char cdata[128] = {'\0'};puts("请输入字符串");scanf("%s",cdata);puts(cdata);return 0;
}
/*
E:\code\一阶段C语言\第七章_字符串>gcc demo_puts_gets.cE:\code\一阶段C语言\第七章_字符串>a.exe
请输入字符串
chenlichenshuai
chenlichenshuai
*/

5.2.2 gets函数输入字符串:

/*gets函数原型:*/
char* gets(char *str);
  • 因为本函数可以无限读取,易发生溢出。如果溢出,多出来的字符将被写入到堆栈中,这就覆盖了堆栈原先的内容,破坏一个或多个不相关变量的值

/*使用gets函数输入字符串
*/
#include <stdio.h>int main()
{char cdata[128] = {'\0'};puts("请输入字符串");gets(cdata);puts(cdata);return 0;
}
/*
E:\code\一阶段C语言\第七章_字符串>gcc demo_puts_gets.cE:\code\一阶段C语言\第七章_字符串>a.exe
请输入字符串
chenlichenshuai
chenlichenshuai
*/

5.3 字符串拷贝函数strcpy:

5.3.1 strcpy函数原型:

/*strcpy函数原型:*/
char* strcpy(char *dest, const char *src)
/*    字符串拷贝函数strcpy(拷贝到哪里去,从哪里拷贝);*/

5.3.2 字符串拷贝函数strcpy应用:

#include <stdio.h>
#include <string.h>int main()
{char str[128] = {'\0'};char *p = "chenlichen handsome";strcpy(str,p);puts(str);return 0;
}
/*程序运行结果:
E:\code\一阶段C语言\第七章_字符串>gcc demo_strcpy.cE:\code\一阶段C语言\第七章_字符串>a.exe
chenlichen handsome
*/

5.3.3 自己实现字符串拷贝函数strcpy:

/*第一种自己实现字符串拷贝函数:
*/
#include <stdio.h>char* myStrcpy(char *dest, char *src)
{if(dest == NULL || src == NULL){return NULL;}char *bak = dest;while(*src != '\0'){*dest = *src;dest++;src++;}*dest = '\0';return bak;
}int main()
{char str[128] = {'\0'};char *p = "chenlichen handsome";myStrcpy(str,p);puts(str);return 0;
}
/*
E:\code\一阶段C语言\第七章_字符串>gcc demo_strcpy.cE:\code\一阶段C语言\第七章_字符串>a.exe
chenlichen handsome
*/
/*第二种自己实现字符串拷贝函数:
*/
#include <stdio.h>char* myStrcpy2(char *dest, char *src)
{if(dest == NULL || src == NULL){return NULL;}char *bak = dest;while(*src != '\0'){*dest++ = *src++;}*dest = '\0';return bak;
}int main()
{char str[128] = {'\0'};char *p = "chenlichen handsome";myStrcpy2(str, p);puts(str);return 0;
}
/*
E:\code\一阶段C语言\第七章_字符串>gcc demo_strcpy.cE:\code\一阶段C语言\第七章_字符串>a.exe
chenlichen handsome
*/
/*第三种自己实现字符串拷贝函数:
*/
#include <stdio.h>char* myStrcpy3(char *dest, char *src)
{if(dest == NULL || src == NULL){return NULL;}char *bak = dest;while((*dest++ = *src++) != '\0');*dest = '\0';return bak
}int main()
{char str[128] = {'\0'};char *p = "chenlichen handsome";myStrcpy3(str, p);puts(str);return 0;
}
/*
E:\code\一阶段C语言\第七章_字符串>gcc demo_strcpy.cE:\code\一阶段C语言\第七章_字符串>a.exe
chenlichen handsome
*/

5.4 strncpy部分字符拷贝函数:

5.4.1 strncpy函数原型和作用:

/*strncpy函数原型:*/
char* strncpy(char *dest, const char *src, int n);
/*    strncpy(拷贝到哪里去,从哪里拷贝,要拷贝多少);    strncpy函数作用:表示把src所指向的字符串中以src地址开始的前n个字节复制到dest所指的数组中,并返回被复制后的dest*/

5.4.2 strncpy函数应用:

#include <stdio.h>
#include <string.h>int main()
{char str[128] = {'\0'};char *p = "chenlichen handsome";strncpy(str, p, 6);puts(str);return 0;
}
/*
E:\code\一阶段C语言\第七章_字符串>gcc demo_strncpy.cE:\code\一阶段C语言\第七章_字符串>a.exe
chenli
*/

5.4.3 自己实现部分字符串拷贝函数strncpy:

#include <stdio.h>
#include <string.h>char* myStrncpy(char *dest, char *src, int count)
{if(dest == NULL || src == NULL){return NULL;}char *bak = dest;while(*src != '\0' && count>0){*dest++ = *src++;count--;}if(count > 0){while(count > 0){count--;*dest++ = '\0';}return dest;}*dest = '\0';return bak;
}int main()
{char str[128] = {'\0'};char *p = "chenlichen handsome";myStrncpy(str, p, 6);puts(str);return 0;
}
/*
E:\code\一阶段C语言\第七章_字符串>gcc demo_strncpy.cE:\code\一阶段C语言\第七章_字符串>a.exe
chenli
*/

5.5 assert断言函数:

5.5.1 assert断言函数认知:

/*assert 宏的原型定义在 assert.h 中,其作用是如果它的条件返回错误,则终止程序执行*/
#include <assert.h>
  • assert 的作用是现计算表达式 expression ,如果其值为假(即为0),那么它先向 stderr 打印一条出错信息,然后通过调用 abort 来终止程序运行。

  • 使用 assert 的缺点是,频繁的调用会极大的影响程序的性能,增加额外的开销。

5.5.2 assert断言函数原型:

/*assert函数原型:*/
void assert(int expression);

5.5.3 assert断言函数应用:

#include <stdio.h>
#include <assert.h>char* myStrcpy(char *dest, char *src)
{assert(dest != NULL && src != NULL);//断言函数char *bak = dest;while(*src != '\0'){*dest++ = *src++;}*dest = '\0';return bak;
}int main()
{char str[128] = {'\0'};char *p = "chenlichen shuai";myStrcpy(str,p);puts(str);return 0;
}
/*
E:\code\一阶段C语言\第七章_字符串>gcc demo_assert.cE:\code\一阶段C语言\第七章_字符串>a.exe
chenlichen shuai
*/

5.6 strcat字符串拼接函数:

5.6.1 strcat函数原型和作用:

/*strcat函数原型:*/
char* strcat(char *dest, const char *src);
/*strcat(拼接到哪里去,从哪里拼接);strcat作用:把src所指向的字符串(包括“\0”)复制到dest所指向的字符串后面(删除*dest原来末尾	的“\0”)。要保证*dest足够长,以容纳被复制进来的*src。*src中原有的字符不变。返回指向dest的指针。
*/

5.6.2 strcat字符串拼接函数应用:

#include <stdio.h>
#include <string.h>int main()
{char str[128] = "chenlichen";char *p = " handsome";strcat(str,p);	//strcat(拼接到哪里去,从哪里拼接);puts(str);return 0;
}
/*
E:\code\一阶段C语言\第七章_字符串>gcc demo_strcat.cE:\code\一阶段C语言\第七章_字符串>a.exe
chenlichen handsome
*/

5.6.3 自己实现strcat字符串拼接函数:

/*自己实现字符串拼接函数方法一:
*/
#include <stdio.h>
#include <assert.h>char* myStrcat(char *dest, char *src)
{assert(dest != NULL && src != NULL);char *bak = dest;while(*dest != '\0'){dest++;}while(*src != '\0'){*dest++ = *src++;}*dest = '\0';return bak;
}int main()
{char str[128] = "chenlichen";char *p = " handsome";myStrcat(str,p);puts(str);return 0;
}
/*
E:\code\一阶段C语言\第七章_字符串>gcc demo_strcat.cE:\code\一阶段C语言\第七章_字符串>a.exe
chenlichen handsome
*/
/*自己实现字符串拼接函数方法二:
*/
#include <stdio.h>
#include <assert.h>
#include <string.h>char* myStrcat2(char *dest, char *src)
{char *bak = dest;strcpy(dest+strlen(dest),src);	//字符串拷贝函数strcpy(拷贝到哪里去,从哪里拷贝);return bak;
}int main()
{char str[128] = "chenlichen";char *p = " handsome";myStrcat2(str,p);puts(str);return 0;
}
/*
E:\code\一阶段C语言\第七章_字符串>gcc demo_strcat.cE:\code\一阶段C语言\第七章_字符串>a.exe
chenlichen handsome
*/
/*自己实现字符串拼接函数方法三:
*/
#include <stdio.h>
#include <assert.h>
#include <string.h>char* myStrcat3(char *dest, char *src)
{assert(dest != NULL && src != NULL);char *bak = dest;for( ; *dest!='\0'; dest++);while((*dest++ = *src++) != '\0');*dest = '\0';return bak;
}int main()
{char str[128] = "chenlichen";char *p = " handsome";myStrcat3(str,p);puts(str);return 0;
}
/*
E:\code\一阶段C语言\第七章_字符串>gcc demo_strcat.cE:\code\一阶段C语言\第七章_字符串>a.exe
chenlichen handsome
*/

5.7 strcmp字符串比较函数:

5.7.1 strcmp函数原型和作用:

/*strcmp函数原型:*/
int strcmp(const char *str1, const char *str2);
/*strcmp作用:若str1=str2,则返回零;若str1<str2,则返回负数;若str1>str2,则返回正数
*/

5.7.2 strcmp函数应用:

/*如果两个字符串一样,则ret = 0;
*/
#include <stdio.h>
#include <string.h>int main()
{char *str1 = "chenlichen";char *str2 = "chenlichen";int ret;ret = strcmp(str1,str2);if(ret == 0){puts("两个字符串一样");}printf("ret = %d\n",ret);return 0;
}
/*
E:\code\一阶段C语言\第七章_字符串>gcc demo_strcmp.cE:\code\一阶段C语言\第七章_字符串>a.exe
两个字符串一样
ret = 0
*/
/*如果str1 < str2,则ret = -1;
*/
#include <stdio.h>
#include <string.h>int main()
{char *str1 = "chenlichena";char *str2 = "chenlichenb";int ret;ret = strcmp(str1,str2);if(str1 == str2){puts("两个字符串一样");}printf("ret = %d\n",ret);return 0;
}
/*
E:\code\一阶段C语言\第七章_字符串>gcc demo_strcmp.cE:\code\一阶段C语言\第七章_字符串>a.exe
ret = -1
*/
/*如果str1 > str2,则ret = 1;
*/
#include <stdio.h>
#include <string.h>int main()
{char *str1 = "chenlichenb";char *str2 = "chenlichena";int ret;ret = strcmp(str1,str2);if(str1 == str2){puts("两个字符串一样");}printf("ret = %d\n",ret);return 0;
}
/*
E:\code\一阶段C语言\第七章_字符串>gcc demo_strcmp.cE:\code\一阶段C语言\第七章_字符串>a.exe
ret = 1
*/

5.7.3 自己实现字符串比较函数strcmp:

/*自己实现字符串比较函数strcmp;
*/
#include <stdio.h>int myStrcmp(char *str1, char *str2)
{int ret = 0;int n_str1 = 0;int n_str2 = 0;char *bakstr1 = str1;char *bakstr2 = str2;while(*str1 != '\0' && *str2 != '\0' && (*str1 == *str2)){str1++;str2++;}if(*str1 || *str2){str1 = bakstr1;str2 = bakstr2;while(*str1 != '\0'){n_str1 = n_str1 + *str1++;}while(*str2 != '\0'){n_str2 = n_str2 + *str2++;}}ret = n_str1 - n_str2;if(ret < 0){ret = -1;}if(ret > 0){ret = 1;}return ret;
}int main()
{char *str1 = "chbenlichena";char *str2 = "chaenlichenb";int ret;ret = myStrcmp(str1,str2);if(ret == 0){puts("两个字符串一样");}printf("ret = %d\n",ret);return 0;
}
/*
E:\code\一阶段C语言\第七章_字符串>gcc demo_strcmp.cE:\code\一阶段C语言\第七章_字符串>a.exe
两个字符串一样
ret = 0
*/

5.8 strncmp字符串比较函数:

5.8.1 strncmp函数原型和作用:

/*strncmp函数原型:*/
int strncmp(const char *str1, const char *str2, size_t n);
/*作用:功能是把 str1 和 str2 进行比较,最多比较前 n 个字节,若str1与str2的前n个字符相同,则返回0;若str1大于str2,则返回大于0的值;若str1小于str2,则返回小于0的值。
*/

5.8.2 strncmp函数应用:

/*若两个字符串前6个字符一样,则返回0
*/
#include <stdio.h>
#include <string.h>int main()
{char *str1 = "chenlichen";char *str2 = "chenlichen";int ret;ret = strncmp(str1,str2,6);if(ret == 0){puts("两个字符串前面几个字符一样");}printf("ret = %d\n",ret);return 0;
}
/*
E:\code\一阶段C语言\第七章_字符串>gcc demo_strncmp.cE:\code\一阶段C语言\第七章_字符串>a.exe
两个字符串前面几个字符一样
ret = 0
*/
/*若str1前6个字符 < str2前6个字符,则返回-1
*/
#include <stdio.h>
#include <string.h>int main()
{char *str1 = "achenlichen";char *str2 = "bchenlichen";int ret;ret = strncmp(str1,str2,6);if(ret == 0){puts("两个字符串前几个字符一样");}printf("ret = %d\n",ret);return 0;
}
/*
E:\code\一阶段C语言\第七章_字符串>gcc demo_strncmp.cE:\code\一阶段C语言\第七章_字符串>a.exe
ret = -1
*/
/*若str1前6个字符 > str2前6个字符,则返回1
*/
#include <stdio.h>
#include <string.h>int main()
{char *str1 = "bchenlichen";char *str2 = "achenlichen";int ret;ret = strncmp(str1,str2,6);if(ret == 0){puts("两个字符串前几个字符一样");}printf("ret = %d\n",ret);return 0; 
}
/*
E:\code\一阶段C语言\第七章_字符串>gcc demo_strncmp.cE:\code\一阶段C语言\第七章_字符串>a.exe
ret = 1
*/

相关文章:

C语言字符串

目录 一、字符串的引入和注意事项 1.1 字符串定义的几种方式&#xff1a; 1.2 定义字符串的方法一和方法二的区别&#xff1a; 1.3 字符串输出的几种方式&#xff1a; 1.3.1 循环下标法遍历输出字符串&#xff1a; 1.3.2 转义字符%s输出字符串&#xff1a; 1.3.3 使用puts函…...

Eureka注册中心快速入门

一、提供者与消费者**服务提供者&#xff1a;**一次业务中&#xff0c;被其他微服务调用的服务。&#xff08;提供接口给其他微服务&#xff09;**服务消费者&#xff1a;**一次业务中&#xff0c;调用其他微服务的服务。&#xff08;调用其它微服务提供的接口&#xff09;比如…...

xmu 离散数学 卢杨班作业详解【1-3章】

文章目录第一章 命题逻辑常用latex数学公式1.4.5679101113171923242627第二章 一阶逻辑1.2.3.6.9.10.12.13.一阶逻辑推理理论12.13.15.第三章 集合2478101213.第一章 命题逻辑 常用latex数学公式 符号代码∨\vee∨$\vee$∧\wedge∧$\wedge$→\rightarrow→$\rightarrow$⇒\Ri…...

mvn命令

在IDEA右侧Maven菜单中&#xff0c;有以下几种指令。 clean&#xff1a;清理&#xff0c;清除上一次构建生产的文件。执行该命令会删除项目地址下的target文件&#xff0c;但不会删除本地的maven已生成的文件。 validate&#xff1a;验证&#xff0c;验证项目是否正确且所有必…...

JS - 事件循环EventLoop

一、面试题&#xff1a;说一下事件循环&#xff08;回答思路梳理&#xff09; 首先 js 是单线程运行的&#xff08; JS 可以修改 DOM&#xff0c;如果在 JS 执行的时候 UI 线程还在工作&#xff0c;就可能导致不能安全的渲染 UI&#xff09;&#xff0c;在代码执行的时候&…...

【Java基础】30分钟Git 从入门到精通

一、 版本控制工具1、什么是版本控制系统&#xff1f;版本控制系统&#xff08;Version Control System&#xff09;:是一种记录一个或若干文件内容变化&#xff0c;以便将来查阅特定版本修订情况的系统。版本控制系统不仅可以应用于软件源代码的文本文件&#xff0c;而且可以对…...

0100 MySQL03

1.distinct关键字 把查询结果去除重复记录&#xff0c;原表数据不会被修改,只能出现在字段的最前端 select distinct job from emp; select distinct job,deptno from emp;//表示两个字段联合起来 去重 2.连接查询 从一张表中单独查询&#xff0c;称为单表查询 两张表联合…...

32- PyTorch基础 (PyTorch系列) (深度学习)

知识要点 PyTorch可以说是现阶段主流的深度学习框架 . 1 PyTorch入门 1.1 PyTorch概述 Torch是什么&#xff1f;一个火炬&#xff01;其实跟Tensorflow中Tensor是一个意思&#xff0c;可以当做是能在GPU中计算的矩阵.&#xff0c;也可以当做是ndarray的GPU版&#xff01; PyT…...

用gdb.attach()在gdb下断点但没停下的情况及解决办法

在python中&#xff0c;如果导入了pwntools&#xff0c;就可以使用里面的gdb.attach(io)的命令来下断点。 但是这一次鼠鼠遇到了一个情况就是下了断点&#xff0c;但是仍然无法在断点处开始运行&#xff0c;奇奇怪怪。 这是我的攻击脚本 我们运行一下。 可以看到其实已经运行起…...

Linux入门篇-作业(jobs)调度(本质仍然是进程)

简介 之所以叫做作业调度&#xff0c;作业是以shell为单位的&#xff0c;一个shell建立的作业&#xff0c;不会被另外一个shell看到&#xff08;包 括root&#xff09;&#xff0c;但是仍然可以看到作业对应的进程。①前台进程&#xff08;front process&#xff09; 运行在用户…...

vue 监听 取消监听

vue 的 watch 除了可以使用声明式的配置项以外&#xff0c;还可以通过命令式 this.$watch 方法。 如下是我们比较少用的命令式&#xff08;想要初始只监听一次&#xff0c;必须命令式写法&#xff09;&#xff1a; 监听只运行一次 声明式 export default{data: {showType: fa…...

0103深度优先搜索和单点连通-无向图-数据结构和算法(Java)

文章目录1.1 走迷宫1.2 图的深度优先搜索实现1.3 算法分析及性能1. 4 单点连通性后记1.1 走迷宫 简单的迷宫&#xff0c;如下图1.1-1所示&#xff1a; 探索迷宫而不迷路&#xff0c;我们需要&#xff1a; 选择一条没有标记过的通道&#xff0c;在你走过的路上铺一条绳子&…...

进销存管理系统

技术&#xff1a;Java等摘要&#xff1a;进销存管理系统是为了实现企业仓库商品管理的系统化、规范化和自动化&#xff0c;从而提高企业管理效率而设计开发的管理信息系统。它完全取代了过去一直用人工管理的工作方式&#xff0c;避免了由于管理人员手工操作上的疏忽以及管理质…...

Sonar:VSCode配置SonarLint/SonarLint连接SonarQube

需求描述 公司为项目代码配置了Sonar检测&#xff0c;希望在VSCode中开发项目时能够同步检测结果。 注意事项 SonarQube版本必须为7.9&#xff0c;否则SonarLint无法连接&#xff08;GitHub-SonarLint-Wiki第一行就有说明&#xff09;&#xff01;&#xff01;&#xff01;S…...

陀螺仪小车(Forerake-Car)

项目简介&#xff1a;搭建一辆有arduino UNO 与rnf24l01组成的小车&#xff1b;手部安装由arduino nano开发板、nrf24l01、imu构成的手势控制器&#xff0c;利用手势控制器检测手部状态、发送信号对小车进行前进&#xff0c;实现基于卡尔曼滤波的MPU6050姿态结算。 准备工作&am…...

Leetcode Day5 含有重复元素集合的组合+

1、含有重复元素集合的组合 给定一个可能有重复数字的整数数组 candidates 和一个目标数 target &#xff0c;找出 candidates 中所有可以使数字和为 target 的组合。 candidates 中的每个数字在每个组合中只能使用一次&#xff0c;解集不能包含重复的组合。 【题目传送门】 思…...

Mac Book pro(M1)使用总结

1、拿到电脑激活的时候&#xff0c;一定要记住账号密码及安全问题的答案。 2、显示隐藏文件夹&#xff1a; 3、显示.git或者gitignore等隐藏后缀的文件&#xff1a; 打开终端 defaults write com.apple.finder AppleShowAllFiles TRUE重启Finder在终端输入 killall Finder …...

QML集成JavaScript

在QML中可以使用现有的QML元素来创建页面&#xff0c;但QML紧密的集成了必要的JavaScript。 但QML中使用JavaScript比较严格&#xff0c;在QML中不可以添加或修改JavaScript全局对象成员&#xff0c;这样可能会使用一个未经声明的变量。 内联JavaScript 一些小型的JavaScript函…...

学习周报3.5

文章目录前言文献阅读摘要介绍方法总结相关性总结前言 本周阅读文献《Multi-step ahead probabilistic forecasting of multiple hydrological》&#xff0c;文献主要提出一种基于三维卷积神经网络、卷积最小门记忆神经网络和变分贝叶斯神经网络的混合深度学习模型&#xff08…...

java基础学习篇

java学习 多写&#xff08;代码、笔记、文章&#xff09;&#xff0c;多练&#xff08;交流、思维、技能&#xff09;&#xff0c;多分享&#xff0c;多提问、多思考 什么是计算机 由硬件和软件组成&#xff0c;广泛应用在科学计算、数据处理、自动控制&#xff0c;计算机辅…...

Go 语言基础语法及应用实践

Go语言是一门由Google开发的静态类型、编译型的开源编程语言,被设计成简单、高效、安全的语言。作为一门相对年轻的语言,Go语言的使用范围正在不断扩大,特别是在Web开发、云计算、容器化和分布式系统等领域越来越受到欢迎。 在本篇文章中,我们将探讨Go语言的基础语法及应用…...

C语言自定义类型---进阶

之前的文章中有结构体初阶知识的讲解&#xff0c;对结构体不是很了解的小伙伴可以先去去看一下结构体初阶 结构体&#xff0c;枚举&#xff0c;联合结构体结构体类型的声明特殊的声明结构的自引用结构体变量的定义和初始化结构体内存对齐 <3 <3 <3(重点)那为什么存在内…...

85.链表总结

链表总结 链表总结与进阶 抽象数据类型&#xff08;ADT abstract data type&#xff09;与抽象数据接口&#xff08;ADI abstract data Interface&#xff09; 链表实际上就是对于结构体、结构体指针和结构体内可以包含指向同类型的结构体指针不可以包含指向同类型的结构体的应…...

【博学谷学习记录】超强总结,用心分享|狂野大数据课程【DataFrame的相关API】的总结分析

操作dataFrame一般有二种操作的方式, 一种为SQL方式, 另一种为DSL方式 SQL方式: 通过编写SQL语句完成统计分析操作DSL方式: 领域特定语言 指的通过DF的特有API完成计算操作(通过代码形式)从使用角度来说: SQL可能更加的方便一些, 当适应了DSL写法后, 你会发现DSL要比SQL更加…...

粒子群优化最小二乘支持向量机SVM回归分析,pso-lssvm回归预测

目录 支持向量机SVM的详细原理 SVM的定义 SVM理论 SVM应用实例,粒子群优化最小二乘支持向量机SVM回归分析 代码 结果分析 展望 支持向量机SVM的详细原理 SVM的定义 支持向量机(support vector machines, SVM)是一种二分类模型,它的基本模型是定义在特征空间上的间隔最大…...

lavis多模态开源框架学习--安装

安装lavis安装lavis测试安装问题过程中的其他操作安装lavis 因为lavis已经发布在pypi中&#xff0c;所以可以直接利用pip安装 pip install salesforce-lavis测试安装 from lavis.models import model_zoo print(model_zoo) # # Architectures Types # # …...

【IDEA】如何在Tomcat上创建部署第一个Web项目?

看了网上很多教程&#xff0c;发现或多或都缺失了一些关键步骤信息&#xff0c;对于新手小白很不友好&#xff0c;那么今天就教大家如何在Tomcat服务器&#xff08;本地&#xff09;上部署我们的第一个Web项目&#xff1a; 共分为三个部分&#xff1a; 1. IDEA创建Web项目&am…...

程序员画流程图的工具Draw.io

Draw.io 是一个很好用的免费流程图绘制工具,制图结果本质上是xml文件&#xff0c;web版和桌面版可以支持导出图像&#xff08;png或者svg矢量图都可以&#xff09;。你可以利用它绘制一系列的图表、图示或图形&#xff0c;包括流程图、UML类图、组织结构图、泳道图、E-R 图、文…...

CAPL脚本DBLookup函数动态访问CAN 报文的属性

&#x1f345; 我是蚂蚁小兵&#xff0c;专注于车载诊断领域&#xff0c;尤其擅长于对CANoe工具的使用&#x1f345; 寻找组织 &#xff0c;答疑解惑&#xff0c;摸鱼聊天&#xff0c;博客源码&#xff0c;点击加入&#x1f449;【相亲相爱一家人】&#x1f345; 玩转CANoe&…...

2022年显卡性能跑分排名表

2022年显卡性能跑分排名表&#xff08;数据来源于快科技&#xff09;这个版本的电脑显卡跑分榜第一的是NVIDIA GeForce RTX 3090 Ti显卡。由于显卡跑分受不同的测试环境、不同的显卡驱动版本以及不同散热设计而有所不同&#xff0c;所以显卡跑分会一直变化。 前二十名的台式电…...