注意注意,用这个的时候加上#include<string.h>
要不然疯狂报错
strlen和sizeof–长度
strlen
用法:strlen(字符串数组符号)
解释:strlen 函数用于返回指定字符串的长度。
C 语言字符串的长度取决于结束符(’\0’)的位置。
一个字符串的长度指的是从起始位置到结束符的字符个数(不包含结束符‘\0’本身。
对于字符串的长度和字符串数组的大小开始的时候很容易混淆
举个栗子:
#define _CRT_SECURE_NO_WARNINGS//这个是vs2017特有的,不是 vs2017的小伙伴请忽略
#include<stdio.h>
#include<string.h>
int main()
{
char str1[100] = "123456789";//预设100个位置,这里有9个字符
printf("%u", strlen(str1));//打印出来
}
结果:
温馨提示:size_t 被定义于 stddef.h 头文件中,它事实上就是无符号整形(unsigned int)。所以用%u
sizeof
用法:sizeof(字符串数组)
解释:字符串数组大小
上边代码定义一个可以存放 100 个字符的数组sizeof(mystr) 的结果是 100
举个栗子:
#define _CRT_SECURE_NO_WARNINGS//这个是vs2017特有的,不是 vs2017的小伙伴请忽略
#include<stdio.h>
#include<string.h>
int main()
{
char str1[100] = "123456789";//预设100个位置,这里有9个字符
printf("%u\n", sizeof(str1));//打印出来
printf("%d", sizeof(str1));//个人暴力理解,其实d和u也差不多
//但是u就是一定是正数才可以,如果一个负数用u,就凉了
}
结果:
strcpy 与strncpy–拷贝
strcpy
用法:strcpy(目标数组, 待拷贝的字符串)
解释:函数将待拷贝字符串拷贝到目标数组中。
如果待拷贝字符串的长度小于目标数组,有‘\0’来作为结束符号,但是如果待拷贝字符串长度大于目标数组,就会有溢出,意思就是会遗漏出来,但是vs2017就直接报错了
栗子1:
#define _CRT_SECURE_NO_WARNINGS//这个是vs2017特有的,不是 vs2017的小伙伴请忽略
#include<stdio.h>
#include<string.h>
int main()
{
char str1[10] = "123456789";//
char str2[11];
char str3[4];
strcpy(str2, str1);//可以容纳
//strcpy(str3, str1);//会有漏掉的部分
printf("%s\n", str2);//打印出来
//printf("%s",str3);
}
结果:
栗子2:
#define _CRT_SECURE_NO_WARNINGS//这个是vs2017特有的,不是 vs2017的小伙伴请忽略
#include<stdio.h>
#include<string.h>
int main()
{
char str1[10] = "123456789";//
char str2[11];
char str3[4];
//strcpy(str2, str1);//可以容纳
strcpy(str3, str1);//会有漏掉的部分
//printf("%s\n", str2);//打印出来
printf("%s",str3);
}
结果:
strncpy
用法:strncpy(目标数组, 待拷贝的字符串,指定长度n)
解释:函数将待拷贝字符串的 n 个字符拷贝到目标数组中。
如果待拷贝字符串的长度小于 n,那么就用 ‘\0’ 填充额外的空间。
举个栗子:
#define _CRT_SECURE_NO_WARNINGS//这个是vs2017特有的,不是 vs2017的小伙伴请忽略
#include<stdio.h>
#include<string.h>
int main()
{
char str1[] = "123456789";//这里有9个字符
char str2[100] = "";//预设100个位置
strncpy(str2, str1,8);
printf("%s", str2);//打印出来
}
结果
如果待拷贝字符串的长度大于或等于 n,那么只有 n 个字符被拷贝到目标数组中
(注意:这样的话将不会以结束符 ‘\0’ 结尾)。会有缺少部分。
提示:为了使该函数更“安全”,建议使用 数组名[sizeof(数组名) - 1] = ‘\0’; 语句确保目标字符串是以 ‘\0’ 结尾。
源字符串和目标数组的位置不应该重叠。虽然不报错,但是主要是这样没有什么变化,没有啥意义。
举个栗子:
#define _CRT_SECURE_NO_WARNINGS//这个是vs2017特有的,不是 vs2017的小伙伴请忽略
#include<stdio.h>
#include<string.h>
int main()
{
char str1[] = "123456789";
strncpy(str1, str1,5);//你不会天真的认为结果是12345吧,哈哈,那就错了
printf("%s",str1);
}
结果:
strcat与strncat–连接
strcat
用法:strcat(数组1,数组2)
解释:strcat 函数用于连接两个字符串。
将源字符串拷贝并连接到目标数组存放的字符串后边,此过程将覆盖第一个参数的结束符 ‘\0’。两个参数的位置不应该重叠。
栗子:
#define _CRT_SECURE_NO_WARNINGS//这个是vs2017特有的,不是 vs2017的小伙伴请忽略
#include<stdio.h>
#include<string.h>
int main()
{
char str1[100] = "hello";//注意这里要有大于两个字符串长度之和的数组大小
//要不然又开始报错了
char str2[] = "how are you?";
strcat(str1, str2);
printf("%s\n",str1);
}
结果;
返回值:返回值是指向目标字符串的指针。
如果觉得丑,可以用这个
栗子:
#define _CRT_SECURE_NO_WARNINGS//这个是vs2017特有的,不是 vs2017的小伙伴请忽略
#include<stdio.h>
#include<string.h>
int main()
{
char str1[100] = "hello";
char str2[] = "how are you?";
strcat(str1, "!");
strcat(str1,str2);
printf("%s\n",str1);
}
结果:
strncat
用法:
strncat(数组1,数组2,字符串长度n)
解释:
注意,对于数组1,应该包含一个字符串,并且有足够容纳连接后的总字符串长度的空间。
strncat 函数用于拷贝数组2中的 n 个字符到目标数组的字符串后边,并在末尾添加结束符 ‘\0’。
如果数组2的长度小于 n,那么不会像 strncpy 函数那样使用 ‘\0’ 进行填充(但结束符 ‘\0’ 还是有的)。
另外,目标数组中的原有的字符串并不算在 n 中
栗子:
#define _CRT_SECURE_NO_WARNINGS//这个是vs2017特有的,不是 vs2017的小伙伴请忽略
#include<stdio.h>
#include<string.h>
int main()
{
char str1[100] = "hello";//这里的100,为后面新字符串的加入留有足够空间
char str2[] = "how are you?";
strncat(str1, "!",1);
strncat(str1,str2,1);
printf("%s\n",str1);
}
结果:
strcmp与strncmp–比较ASCII码
strcmp
用法:
strcmp(数组1,数组2)
解释:
strcmp 函数用于比较两个字符串。
该函数从第一个字符开始,依次比较每个字符的 ASCII 码大小,直到发现两个字符不相等或抵达结束符(’\0’)为止。
如果相等返回0;数组1某个ASCII码大于第二个,按顺序的,就返回大于0的数;如果小于,就返回小于0的数,判断到有不一样的地方就直接终止。
同时strcmp经常会和!一起使用,比如说!strcmp(数组1,数组2)
就是strcmp==0的意思。会用于判断
栗子:
//字符串处理函数
#define _CRT_SECURE_NO_WARNINGS//这个是vs2017特有的,不是 vs2017的小伙伴请忽略
#include<stdio.h>
#include<string.h>
int main()
{
char str1[] = "abc";
char str2[] = "bbc";
(!strcmp(str1, str2)) ? printf("same") : printf("different");//这个是一个判断的骚操作
//喜欢的可以百度一下,但是如果懒也没关系,我下次会详细解释的,会有各种各样的骚操作哟!
//嘻嘻
}
结果:
strncmp
用法:
strcmp(数组1,数组2,长度n)
解释:
strncmp 函数用于比较两个字符串的前 n 个字符。
该函数从第一个字符开始,依次比较每个字符的 ASCII 码大小,发现两个字符不相等或抵达结束符(’\0’)为止,或者前 n 个字符完全一样,也会停止比较。
栗子:
#define _CRT_SECURE_NO_WARNINGS//这个是vs2017特有的,不是 vs2017的小伙伴请忽略
#include<stdio.h>
#include<string.h>
int main()
{
char str1[] = "abc";
char str2[] = "abcdefg";
(!strncmp(str1, str2,3)) ? printf("same") : printf("different");
}
结果: