字符函数和字符串函数1(详解)

news2024/11/24 4:39:53

❤️ 作者简介 :对纯音乐情有独钟的阿甘 致力于C、C++、数据结构、TCP/IP、数据库等等一系列知识,对纯音乐有独特的喜爱
📗 日后方向 : 偏向于CPP开发以及大数据方向,如果你也感兴趣的话欢迎关注博主,期待更新


请添加图片描述

字符函数和字符串函数

  • 😶前言
  • 1. 函数介绍
    • 1.1 strlen
    • 1.1.1 strlen格式
    • 1.1.2 strlen的使用
    • 1.1.3 strlen的模拟实现
      • 1.1.3.1 计数器方式
      • 1.1.3.2 不能创建临时变量计数器
      • 1.1.3.3 指针-指针的方式
    • 1.1.4 strlen函数使用注意事项
  • 1.2 strcpy
    • 1.2.1 strcpy格式
    • 1.2.2 strcpy的使用
    • 2.1.3 模拟实现strcpy
    • 2.1.4 strcpy函数使用注意事项
  • 1.3 strcat
    • 1.3.1 strcat格式
    • 1.3.2 strcat的使用
    • 1.3.3模拟实现strcat
    • 1.3.4 strcat函数使用注意事项
  • 1.4 strcmp
    • 1.4.1 strcmp格式
    • 1.4.2 strcmp的使用
    • 1.4.3 模拟实现strcat
    • 1.4.4 strcat函数使用注意事项
  • 1.5 strncpy
    • 1.5.1 strncpy格式
    • 1.5.2 strncpy的使用
    • 1.5.3 strncpy函数使用注意事项
  • 1.6 strncat
    • 1.6.1 strncat格式
    • 1.6.2 strncat的使用
    • 1.6.3 strncat函数使用注意事项
  • 1.7 strncmp
    • 1.7.1 strncmp格式
    • 1.7.2 strncmp的使用
    • 1.7.3 strncmp函数使用注意事项

😶前言

C语言中对字符和字符串的处理很是频繁,但是C语言本身是没有字符串类型的,字符串通常放在常量字符串中或者字符数组中。
字符串常量适用于那些对它不做修改的字符串函数

在这里相信你知道了字符以及字符串的概念,那你是否知道C语言中库里有定义好的字符函数和字符串函数呢?
如果你之前做过了解,但你是否用过呢?
今天我们一起来学习一下我们C语言中字符函数以及字符串函数的了解以及使用

1. 函数介绍

很多情况下,我们除了存储定义一个字符串,我们还需要做很多其他的工作。可以对字符串进行分析、合并、拷贝、修改等等其他操作。那我们怎么样进行实现呢?🤨
我们能想到的,C语言开发的程序员们肯定也会想到这些麻烦,所以C语言库中所包含的字符串函数就是用来帮助我们轻松实现实现这些操作的
在C语言中字符串函数都包含在<string.h>中

1.1 strlen

🐥我们定义了一个字符串,我们想要求其长度,我们应该怎么做呢?
还记得我们以前说过,字符串存在字符数组里,我们想要求字符串长度我们可以用一个sizeof()函数来求,可能有的小伙伴还不知道,我们再来重新看一段代码了解sizeof()函数的使用:


#include<stdio.h>
int main()
{
	char arr[] = "abcde";
	int sz = sizeof(arr) / sizeof(arr[0]);
	printf("%d", sz);
}

下面是该程序的输出
在这里插入图片描述
老手已经在点头了,新手还在问为什么😮
那为什么这里输出的是6呢,明明是5个字符。
其实我们在这样存储字符数组的时候,后面是有一个\0的,所以才会返回数字6
我们来看arr数组中到底存了些什么
在这里插入图片描述
回归正题,我们想求字符的长度,如果每次都这样是不是很麻烦?
接下来,我们来看看strlen函数是如何帮我们解决麻烦的

1.1.1 strlen格式

🍕strlen函数为我们提供了一个求字符串长度很方便的工具,它的格式为:

size_t strlen ( const char * str );

1.函数参数为const char *str
我们传入的str字符串就是求长度的目标字符串,而且前面加了const,表明这是不可修改的字符串,这是为了防止原数据的损坏

2.返回参数为size_t
返回值的类型为size_t,size_t 类型表示C中任何对象所能达到的最大长度,它是无符号整数

1.1.2 strlen的使用

我们来看一段代码:


int main()
{
	if (strlen("abc") - strlen("abcde")>0)
		printf("大于");
	else
		printf("小于等于");
	return 0;
}

我们口算一下,strlen(“abc”)和strlen(“abcde”)的结果,既然是无符号整形,那就是3和5;我们一减是不是就是-2,那我们应该输出小于等于对吗?

我们来看输出结果:
在这里插入图片描述
程序告诉我们这个程序输出结果为大于
这是为什么?
我们要先知道,无符号整形的取值为0~4294967295(这里不懂的请转到数据在内存中的存储)
我们定义一个unsigned a去接收返回值,来看一看a的值为多少
在这里插入图片描述
我们会发现a的值为4294967294
a的值是大于0的,所以程序输出大于
正因为如此,我们在使用strlen函数来比较大小的时候,尽量少使用加减法,直接用大鱼小于号来做比较就可以,如果硬是要用加减法,我们最好将其类型强转为int,方可做大小比较
在这里插入图片描述

这样我们就可以得到我们所需要的答案

🎈在这里我们就是提一下,这是一个易错点,需要注意哦


好了我们再次回归正题,我们大概能了解strlen函数的作用了,我们再来看strlen与sizeof算出来的答案有没有出入

在这里插入图片描述
我们会发现,strlen是不会将 ’\0’ 算进去的,并且我们字符串里面的 ‘\0’ 为strlen的终止字符,从这里开始,我们的strlen就会停止往下计算长度


如果你嫌很难记住的话
我们可以把strlen分解来看:

  • 前面的str就是我们的字符串,其实也就是string的缩写,表示其为字符串函数
  • 后面的len表示长度,也就是长度length的缩写

合起来就是字符串长度函数,这样子就方便记很多啦😁


1.1.3 strlen的模拟实现

模拟实现strlen我们可以有三种方法:

1.1.3.1 计数器方式

int my_strlen(const char * str)
{
int count = 0;
while(*str)
{
count++;
str++;
}
return count;
}

1.1.3.2 不能创建临时变量计数器

int my_strlen(const char * str)
{
if(*str == '\0')
return 0;
else
return 1+my_strlen(str+1);
}

1.1.3.3 指针-指针的方式

int my_strlen(char *s)
{
   char *p = s;
   while(*p != ‘\0’ )
       p++;
   return p-s;
}

1.1.4 strlen函数使用注意事项

🍁综上:
我们需要格外注意

  • 字符串已经 ‘\0’ 作为结束标志,strlen函数返回的是在字符串中 ‘\0’ 前面出现的字符个数(不包含 ‘\0’ )。
  • 参数指向的字符串必须要以 ‘\0’ 结束。
  • 注意函数的返回值为size_t,是无符号的( 易错 )

1.2 strcpy

上面我们实现了如何使用strlen来快速求字符串的长度,那我们想实现字符串的拷贝又怎么办呢?😮

我们如果想要将一个字符串的内容拷贝到另一个字符串里去,我们就只能使用for循环嵌套,一个一个拷贝上去,那我们可不可以简便一点呢?

说到这里,通过我的话你也知道了strcpy的作用是什么
没错,就是用来做字符串的拷贝😀

1.2.1 strcpy格式

🐥strcpy是C语言给我们提供方便进行字符串拷贝的,其格式为:

char* strcpy(char * destination,const char * source );

1.返回类型为char*
char*指向的是我们已经拷贝完毕的数组的首元素地址
2.函数参数类型为char*和const char*
一个可变一个不可变,不可变的字符串是我们需要进行拷贝的,拷贝到可变数组里,也就是英文单词source(来源)和destination(目的地),我们将来自source字符串的数据拷贝到destination字符串里,
destination字符串必须为可变的

1.2.2 strcpy的使用

我们来看代码:


int main()
{
	char arr1[] = "xxxxxxxxxxx";
	char arr2[] = "abcdef";
	strcpy(arr1, arr2);
	puts(arr1);
	return 0; 
}

程序输出结果:
在这里插入图片描述
我们会看到我们输出只输出了abcdef
理论上我们应该输出的是abcdefxxxx
这是为什么呢?
我们来看arr1里面的存储情况


在这里插入图片描述


🤷‍♂️我们会发现,我们这个函数会将 ‘\0’ 也一起拷贝过去,而我们的printf由于输出类型为%s,所以在看到\0,会终止,将\0之前的看作为字符串输出出来。

🤷‍♀️同时,我们也可以看到,我们strcpy的终止条件为看到了\0,这也表明了我们源字符串必须要以 ‘\0’ 结束。

如果我们的目的字符串空间不够大会出现什么情况呢?
我们再来看一个例子:


int main()
{
	char arr1[] = "xxxx";
	char arr2[] = "abcdef";
	strcpy(arr1, arr2);
	printf("%s", arr1);
	return 0;
}

我们发现输出的时候出现了异常😳
在这里插入图片描述
⚡这说明我们的目标字符串必须为足够大的。


我们同样可以把strcpy分解来看:

  • 前面的str就是我们的字符串,表示其为字符串函数
  • 后面的cpy表示长度,也就是copy的简写

合起来就是字符串拷贝函数,这样子就方便记很多啦😁


2.1.3 模拟实现strcpy

char *my_strcpy(char *dest, const char*src)
{
	char *ret = dest;
	assert(dest != NULL);
	assert(src != NULL);
	while((*dest++ = *src++))
	{
		;
	}
	return ret;
}

assert()是一个断言函数,用于测试两个值是否相等。当这两个值不相等时,会抛出一个错误。它常用于单元测试中,用来验证代码的正确性。

2.1.4 strcpy函数使用注意事项

🍁总结:

  • 源字符串必须以 ‘\0’ 结束。
  • 会将源字符串中的 ‘\0’ 拷贝到目标空间。
  • 目标空间必须足够大,以确保能存放源字符串。
  • 目标空间必须可变

1.3 strcat

我们定义了一个字符串,我们因为疏忽,尾部弄掉了另外几个字符,我们想追加字符怎么办?

🐥strcat使用来我们追加字符串的,我们可以使用它来将源字符串追加到目的字符串

1.3.1 strcat格式

char * strcat ( char * destination, const char * source );

1.返回类型为char*,这是我们进行了追加了字符串之后的字符串
2.函数参数为char * destination,const char * source,我们将source字符串追加到destination字符串中进行返回,追加的字符串为不可改变

1.3.2 strcat的使用

我们依旧来看代码展示:


int main()
{
	char arr1[] = "xxxx";
	char arr2[] = "abcdef";
	strcat(arr1, arr2);
	printf("%s", arr1);
	return 0;
}

输出结果
在这里插入图片描述
⚡我们发现出现了异常,此异常为越界访问
说明我们arr1的空间需要足够大
我们将其加长空间再来试一次:


int main()
{
	char arr1[20] = "xxxxx";
	char arr2[] = "abcdef";
	strcat(arr1, arr2);
	printf("%s", arr1);
	return 0;
}

在这里插入图片描述
这个时候我们可以看到arr2的内容已经拷贝到了arr1里面
那我们strcat又是如何判断结束的呢?
难道还是以\0来结束判断的吗
我们再来看一段代码:


😎正所谓我们程序员熟悉任何代码的操作就是不停的敲代码,我们只有在敲代码的时候不断修改调试,才能知道我们的熟练水平。所以趁现在,我们多敲多看


回归正题,我们来看演示代码:

int main()
{
	char arr1[20] = "xxxxx";
	char arr2[] = {'a','b','c','d','e','f'};
	strcat(arr1, arr2);
	printf("%s", arr1);
	return 0;
}

输出结果:
在这里插入图片描述


为什么乱码了, 一乱码就出现烫烫烫,我们的烫哥真是无处不在😎。
我们在arr2中采取这种方式存储字符串是没有\0的,所以这也说明了我们的strcat函数确实是以\0来判断停止条件的


有小伙伴还提出来一个问题:
如果我们字符串自己给自己追加会怎么样?
我们不知道,我们就敲出来,计算机是不会骗我们的
看代码:

int main()
{
	char arr[] = "abcdef";
	strcat(arr, arr);
	printf("%s", arr);
	return 0;
}

输出结果:
在这里插入图片描述
我们可以看到,又出现了异常,这是为什么呢?
我们可以从参数列表来看,目标字符串为可变的,而源字符串为不可变的,如果传入俩一样的,怎么可能即是可变又是不可变的呢?自相矛盾了


我们来把strcat分解来看:

  • 前面的str就是我们的字符串,表示其为字符串函数
  • 后面的cat表示追加

合起来就是字符串追加函数,这样子就方便记很多啦😁


1.3.3模拟实现strcat

char *my_strcat(char *dest, const char*src)
{
	char *ret = dest;
	assert(dest != NULL);
	assert(src != NULL);
	while(*dest)
	{
		dest++;
	}
	while((*dest++ = *src++))
	{
		;
	}
	return ret;
}

1.3.4 strcat函数使用注意事项

🍁总结:

  • 源字符串必须以 ‘\0’ 结束。
  • 目标空间必须有足够的大,能容纳下源字符串的内容。
  • 目标空间必须可修改。

1.4 strcmp

我们有时候需要去比较两个字符串的大小,我们一个一个比较显得格外笨重,那这个时候怎么办呢?

我们就可以使用我们的strcmp函数
🐥strcmp函数是用来比较两个字符串的大小的

1.4.1 strcmp格式

int strcmp ( const char * str1, const char * str2 );

1.返回值为int类型

  • 第一个字符串大于第二个字符串,则返回大于0的数字
  • 第一个字符串等于第二个字符串,则返回0
  • 第一个字符串小于第二个字符串,则返回小于0的数字

2.两个参数都为const char* 类型
表明两个字符串在这个函数均不会改变仅仅做一个比较

1.4.2 strcmp的使用

🍖我们的strcmp函数是通过字符的ASCII码值来进行比较的,先比较第一个相同则比较下一个,直到比较出不相同的两个字符,比较ASCII码值谁大谁小
如果两个都遍历到 '\0’的时候依然相等,那么则判断两个字符串相等
如图所示:
在这里插入图片描述
接下来我们用代码进行演示:


int main()
{
	char arr1[] = "abcde";
	char arr2[] = "abcef";
	char arr3[] = "abcde";
	int a = strcmp(arr1, arr2);
	printf("strcmp(abcde,abcef)=%d\n", a);
	a = strcmp(arr1, arr3);
	printf("strcmp(abcde, abcde)=%d\n", a);
	a = strcmp(arr2, arr1);
	printf("strcmp(abcef, abcde)=%d", a);
	return 0;
}

输出结果:
在这里插入图片描述


其实这个函数的使用还是挺简单的。

1.4.3 模拟实现strcat

char *my_strcat(char *dest, const char*src)
{
	char *ret = dest;
	assert(dest != NULL);
	assert(src != NULL);
	while(*dest)
	{
		dest++;
	}
	while((*dest++ = *src++))
	{
		;
	}
	return ret;
}

1.4.4 strcat函数使用注意事项

🍁总结:

  • 第一个字符串大于第二个字符串,则返回大于0的数字
  • 第一个字符串等于第二个字符串,则返回0
  • 第一个字符串小于第二个字符串,则返回小于0的数字
    不要弄混了

1.5 strncpy

你有没有觉得这个函数的名字跟另一个函数很相似?
没错,这个函数和我们的strcpy非常相似,而且不仅仅是名字很相似只差一个字,功能也很相似。

🐥strncpy函数的功能就是能实现在源字符串拷贝n个字符到目标空间
这个功能实现了我们想拷贝几个字符都可以,相当于strcpy的升级版,是不是很高级
接下来我们来看看他们之间的用法区别在哪里

1.5.1 strncpy格式

char * strncpy ( char * destination, const char * source, size_t num );

1.返回值为char*,返回的是拷贝完毕的字符串
2.参数为目的字符串,源字符串且不可修改,还有一个size_t类型的整型

我们可以猜到大概怎么使用,和前面strcpy差不多,只不过增加了一个整型来限制拷贝

1.5.2 strncpy的使用

先看代码:


int main()
{
	char arr1[20] = "abcd";
	char arr2[] = "xxxxxxxx";
	strncpy(arr1, arr2, 5);
	printf("%s", arr1);
	return 0;
}

输出结果
在这里插入图片描述


有了strcpy的基础这个函数使用起来还是很简单的,只不过限制了长度


😉我们同样也可以将其看做几个部分组成:

  • str表示字符串
  • n表示长度限制
  • cpy表示拷贝

合起来就是strncpy,限制长度的字符串拷贝

1.5.3 strncpy函数使用注意事项

🍁总结:

  • 目标空间必须足够大,以确保能存放拷贝字符串。
  • 目标空间必须可变
  • 拷贝num个字符从源字符串到目标空间。
  • 如果源字符串的长度小于num,则拷贝完源字符串之后,在目标的后边追加0,直到num个。

1.6 strncat

我们的strcpy可以升级添加一个n限制长度,我们的strcat同样可以升级,升级后变成了strncat
🐥strncat就是从源字符串追加n个字符到目标空间


1.6.1 strncat格式

char * strncat ( char * destination, const char * source, size_t num );

1.返回值为char*,返回追加后的字符串
2.参数为一个目的字符串,源字符串,还有一个无符号整型


1.6.2 strncat的使用

看代码:


int main()
{
	char a[10] = "aaaa";
	char b[] = "bbbb";
	strncat(a, b,4);
	printf("%s", a);
	return 0;
}

输出结果:
在这里插入图片描述


我们在使用过程中会发现
我们在输入的无符号整型大于源字符串的长度时,它只会追加到源字符串的最大长度,后面就不会再追加了


在这里插入图片描述
我们修改了无符号整型的数值,大于源字符串长度,输出结果不变


1.6.3 strncat函数使用注意事项

🍁总结:

  • 目标空间必须有足够的大,能容纳下源字符串的内容。
  • 目标空间必须可修改。

1.7 strncmp

🐥不用说,这应该就是取源字符串前n个字符与目标字符串作比较,有了前面几个的经验,很容易就出来了,我们来看一下这个函数的格式以及使用:

1.7.1 strncmp格式

int strncmp ( const char * str1, const char * str2, size_t num );

取str2前num个字符与str1作比较

  • 大于返回1
  • 等于返回0
  • 小于返回-1

1.7.2 strncmp的使用

看代码:

int main()
{
	char arr1[] = "abcde";
	char arr2[] = "abcdff";
	int a=strncmp(arr1, arr2, 4);
	printf("%d", a);
	return 0;
}

输出结果
在这里插入图片描述
我们会发现确实是比较了前5个字符,不然不会返回0

1.7.3 strncmp函数使用注意事项

🍁总结:
取str2前num个字符与str1作比较

  • 大于返回1
  • 等于返回0
  • 小于返回-1

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

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

相关文章

JDBC编程连接MySQL数据库遇到的两个错误

在进行java与MySQL数据库进行连接的时候我遇到了两个报错&#xff0c;在一开始的时候遇到的报错是Access denied for user yulinlocalhost (using password: YES)&#xff0c;此时我在网络上搜索发现是密码出现错误的问题&#xff08;出现该问题确实是密码错误&#xff09;&…

cloudwatch agent通过squid代理上传指标到cloudwatch

1.安装cloudwatch agent代理 1.1、安装cloudwatch代理包 2.2、更改程序包的目录 3.3.创建cloudwatch代理配置文件 运行以下命令配置向导 sudo /opt/aws/amazon-cloudwatch-agent/bin/amazon-cloudwatch-agent-config-wizard 按照提示选择个性化服务 2.安装squid服务器 简…

200行代码写一个简易的C++小黑窗贪吃蛇游戏

分享一个简易的小黑窗贪吃蛇,一共就两百行代码左右(包含注释),很适合初学者巩固语法来练练手. 如果后续需要其他功能也可以再添加. 先小小展示一下: 源码在文末免费领取. 使用工具: VS2019(不是用VS的也可以直接找出cpp和h文件复制到你们用的IDE,甚至是记事本都可以) 闲话…

three.js学习记录(基础)

前言&#xff1a; 页面渲染3D特效&#xff0c;可以从各种图表库&#xff08;例如ECharts&#xff09;中寻找各种适用的模版&#xff0c;也可以寻找第三方插件。。。 一直以来都对three.js充满向往&#xff0c;终于偷闲找了个借口学了起来 参考资料 Three.js – JavaScript 3D…

MySQL数据库(五)

目录 一、数据库的约束 1.1 约束类型 1.1.1 null约束 1.1.2unique约束 1.1.3default默认值约束 1.1.4primary key主键约束 1.1.5foreign key外键约束 二、内容重点总结 一、数据库的约束 1.1 约束类型 not null - 指示某列不能存储 null值。unique - 保证某列的每行必须有唯一…

【C++】入门基础知识

命名空间 由来 在c语言中&#xff0c;任何函数&#xff0c;变量的名字都不能一样&#xff0c;如果是一个人的代码库里还好&#xff0c;大不了自己再改改&#xff0c;但是当和其他人&#xff0c;公司的库合起来&#xff0c;那就很麻烦了&#xff0c;到底是谁的名字改呢&#x…

求Sn=a + aa + aaa + aaaa + aaaaa的前5项之和,其中a是一个数字

求Sna aa aaa aaaa aaaaa的前5项之和&#xff0c;其中a是一个数字。 例如&#xff1a;2 22 222 2222 22222 解析&#xff1a; a aa aaa aaaa aaaaa a a*10a (a*10a)*10 a ((a*10a)*10 a) a ((a*10a)*10 a) a 直接上代码吧&#xff1a; #include&l…

java工作随笔

String s JSONObject.toJSONString(fixedAsset);logger.error("-----------------8------------------" s);CusFixedAssettDTO CusFixedAssettDTO3 JSONObject.parseObject(s, CusFixedAssettDTO.class);父类转子类 相同对象合并 import java.util.Date; Data T…

手把手教你搭建SpringCloud项目(九)集成OpenFeign服务接口调用

一、OpenFeign简介 什么是Feign&#xff1f; Feign是一个声明式WebService客户端。使用Feign能让编写Web Service客户端更加简单。它的使用方法是定义一个服务接口然后在上面添加注解。Feign也支持可拔插式的编码器和解码器。Spring Cloud对Feign进行封装&#xff0c;使其支持…

要想做好日语翻译,你需要这样做?

我们知道&#xff0c;中日两国一衣带水比邻而居&#xff0c;彼此之间的文化贸易往来非常频繁&#xff0c;对日语翻译的需求也日益增加。那么&#xff0c;想要做好日语翻译&#xff0c;我们该怎么做&#xff1f; 首先&#xff0c;要具备扎实的日语语言能力、较高的母语水平以及灵…

零基础学习,轻松打造物业服务小程序

现如今&#xff0c;物业服务已经成为了人们生活中不可或缺的一部分。为了更好地满足人们对物业服务的需求&#xff0c;许多企业和个人开始开发物业服务小程序&#xff0c;以便提供更加便捷和高效的服务。然而&#xff0c;对于大多数人来说&#xff0c;搭建一个小程序可能需要一…

从小白到大神之路之学习运维第64天--------Zabbix监控mysql、ftp服务以及自定义配置

第三阶段基础 时 间&#xff1a;2023年7月19日 参加人&#xff1a;全班人员 内 容&#xff1a; Zabbix监控mysql、ftp服务以及自定义 目录 一、Zabbix监控mysql数据库 二、Zabbix监控ftp服务 三、Zabbix自定义监控项 整体zabbix搭建完成&#xff0c;server端huyang1监…

golang 日志库zap和日志切割实践

介绍 在许多Go语言项目中&#xff0c;我们需要一个好的日志记录器能够提供下面这些功能&#xff1a; 能够将事件记录到文件中&#xff0c;而不是应用程序控制台。 日志切割-能够根据文件大小、时间或间隔等来切割日志文件。 支持不同的日志级别。例如INFO&#xff0c;DEBUG&a…

uni.app开发小程序如何获取当前经纬度、位置信息以及如何重新发起授权定位

uni.app开发小程序如何获取当前经纬度、位置信息以及如何重新发起授权定位 前提 先去微信小程序后台申请 wx.getLocation接口1.引入下载的高德小程序SDK2.data中定义所需变量3.onLoad中获取实例 并调用获取经纬度 位置方法4.定义获取定位经纬度 位置信息方法5.用户拒绝授权后,可…

【MySQL】查询进阶

查询进阶 数据库约束约束类型NULL , DEFAULT , UNIQUE 约束主键约束外键约束 聚合查询聚合函数group by子句HAVING 联合查询内连接外连接自连接子查询单行子查询多行子查询 数据库约束 约束类型 NOT NULL #表示某行不能储存空值 UNIQUE #保证每一行必须有唯一的值 DEFAULT #规…

DT灯光基础(辉光 雾 阴影 渲染选项)

点光源 不能宣染&#xff0c;换个版本。不能正常预览 聚光灯 t 手柄 挡光版 平行光阴影 光线追踪阴影 没有看见阴影 灯光使用贴图 环境光 不进行渲染物体 不渲染阴影 接收阴影 不反射 可以看到反射 没有反射了 灯光链接 取消灯照 灯光雾 辉光 变化不明显

【C++】C++入门必备知识详细讲解

C入门必备知识 一、命名空间1. namespace2. namespace 的使用场景 二、了解 C 中的输入和输出三、缺省参数四、函数重载1. 函数重载的概念2. C支持函数重载的原理 五、引用1. 引用的概念2. 引用特性3. 常引用4. 引用的使用场景&#xff08;1&#xff09;做参数&#xff08;传引…

No.2(3)——双指针算法实现平方数组排序

双指针算法指的是&#xff0c;从数组的两侧开辟指针变量进行查找&#xff0c;这类问题往往通过暴力&#xff08;双循环&#xff09;可以解出&#xff0c;而采用双指针相当于用空间换取时间&#xff0c;省略双层循环中重复的部分。 对于一个含有负数的有序数组&#xff0c;要求保…

Kubernetes Volume及其类型(NFS、SAN) - PV - PVC - PV与PVC与Pod的关系

目录 volume 卷 官方文档&#xff1a;卷 | Kubernetes 一、emptyDir&#xff08;临时卷&#xff09; 二、hostPath卷 type字段参数 hostPath 实验&#xff1a; 三、第3方提供的存储卷&#xff08;百度云、阿里云、亚马逊云、谷歌云等&#xff09; 四、local卷 五、NF…

Geany配置python虚拟环境(Anaconda)

Geany配置python运行环境步骤&#xff1a; 以我的conda为例 我的conda中python虚拟环境base环境python位于路径 D:\Anaconda3 打开Geany -> 生成 -> 设置生成命令 在弹出的窗口内输入以下命令 # Compile选项后修改 "D:\Anaconda3\python.exe" -m py_compi…