1.求字符串长度 strlen
2.长度不受限制的字符串函数 :strcpy, strcat, strcmp
3.长度受限制的字符串函数:strncpy, strncat, strncmp
(以上函数只对字符串有用)
strlen #include<string.h>
size_t strlen (const char* str)(可在 cplusplus 网站具体查询库函数)
1. 字符串要以 '\0' 结尾,返回的是在字符串中 '\0' 前面出现的字符个数。
2.返回的参数为 size_t(相当于 unsigned int),是无符号的
3.模拟实现strlen
举例
#include<stdio.h>
#include<string.h>
int main()
{
int ret = strlen("abcdef");//a b c d e f \0
printf("%d\n", ret);// 6
return 0;
}
模拟实现
#include<stdio.h>
#include<string.h>
#include<assert.h>//使用assert要引的头文件
int my_strlen(const char* str)//const限制 *str,*str不能改变
{
assert(str != NULL);//如果str传的是空指针,则会报错,并显示位置
int count = 0;//用来计数
while (*str != '\0')
{
str++;
count++;
}
return count;
}
int main()
{
char* p = "abcdef";//常量字符串不能修改
int ret = my_strlen(p);
printf("%d\n", ret);//打印结果是 6
return 0;
}
strcpy #include<string.h>
char* strcpy (char* destination, const char* source)
1.destination是拷贝的目的地,source是被拷贝的字
符串(简称源字符串)。
2.源字符串必须有 '\0' ,并且拷贝时会把源字符串中的 '\0' 拷贝到目的地。
3.目标空间要能存放被拷贝的字符串,并且目标空间可变。
4.返回的是目的地空间的地址
5.模拟实现
举例
#include<stdio.h>
#include<string.h>
int main()
{
char arr1[] = "abcdefg";
char* p = "bite";
printf("%s\n", strcpy(arr1, p));//bite
//其中 arr1 内存的是 b i t e \0 f g \0
return 0;
}
模拟实现
#include<stdio.h>
#include<assert.h>
char* my_strcpy(char* dest, const char* s)
{
assert(dest && s);//空指针返回 0
char* ret = dest;//接受目标空间的首地址
while (*dest++ = *s++)//把 \0 也拷贝到目标空间,采用 = ,而不是 ==
{
;
}
return ret;
}
int main()
{
char arr1[] = "abcdefg";
char* p = "bite";//不会改变,可以采用 常量字符串
printf("%s\n", my_strcpy(arr1, p));//bite
return 0;
}
strncpy #include<string.h>
char* strncpy (char* dest, const char* source, size_t num)
1.与strcpy功能类似,只不过可以自己控制要拷贝内容的多少
2.num 指要拷贝的数量,单位是字节
3.如果源字符串的长度小于 num ,拷贝时依旧要在目标位置处追加 '\0' ,直到num个
举例
#include<stdio.h>
#include<string.h>
int main()
{
char arr[] = "abcdefxx";
char* p = "hhh";
printf("%s\n", strncpy(arr, p, 6));//hhh
//arr 里放的内容:h h h \0 \0 \0 x x \0
return 0;
}
strcat #include<string.h>
char* strcat (char* destination,const const* source)
1.源字符串必须以 '\0' 结束,目标空间也要有 '\0'(可以有多个)
2.目标空间必须足够大,能容下接受源字符串后的内容
3.目标空间必须可修改
4.找到目标空间第一个 '\0' ,拷贝从 '\0' 处开始拷贝
5.拷贝时连源字符串的 '\0' 也要拷贝,返回目标空间首地址
6.模拟实现
7.自己追加自己,会一直追加下去
举例
#include<stdio.h>
#include<string.h>
int main()
{
char arr[30] = "ab\0cdefgh";//arr[30],目标空间要足够大
char* p = "bite";
printf("%s\n", strcat(arr, p));//abbite
//arr 里存的内容:a b b i t e \0 g h \0 \0 ……
return 0;
}
模拟实现
#include<stdio.h>
#include<assert.h>
char* my_strcat(char* dest, const char* src)
{
assert(dest && src);//判断不是空指针
char* ret = dest;//返回时需要目标空间的地址
//1.先找到目标空间的第一个'\0'
while (*dest != '\0')
{
dest++;
}
//2.追加字符串
while (*dest++ = *src++)
{
;
}
return ret;
}
int main()
{
char arr[30] = "ab\0cdefgh";
char* p = "bite";
printf("%s\n", my_strcat(arr, p));//abbite
return 0;
}
strncat #include<string.h>
char* strncat (char* dest, const char* source, size_t num)
1.num 指要追加的数量,单位字节
2.无论追加什么,最后都是 '\0' 结尾
3.如果num 数大于源字符串的字符数,其效果等同于 strcat
举例
#include<stdio.h>
#include<string.h>
int main()
{
char arr1[30] = "hello\0xxxxxxx";
char* p1 = "world";
printf("%s\n", strncat(arr1, p1, 3));//hellowor
//arr1:h e l l o w o r \0 x x x x \0 \0……
char arr2[30] = "hello\0xxxxxxx";
char* p2 = "bite";
printf("%s\n", strncat(arr2, p2, 8));//hellobite
//arr2:h e l l o b i t e \0 x x x
return 0;
}
strcmp #include<string.h>
int strcmp (const char* str1, const char* str2)
标准规定:
1.从前往后一个一个字符比较
2.如果有不同,则找到的第一个不同的字符比较()
如果第一个大于第二个,返回大于 0 的数;否则,返回小于 0 的数(不同编译器返回的数字不 同)
("abca"与"abc"比较,a的码值是97,大于 0 的码值0,所以返回大于 0)
3.如果两个字符串相同则返回 0
4.比较的是第一个 '\0' 前的内容
5.模拟实现
举例
#include<stdio.h>
#include<string.h>
int main()
{
char* p1 = "abcdef";
char* p2 = "abcd";
char* p3 = "abcd";
printf("%d\n", strcmp(p1, p2));//1
printf("%d\n", strcmp(p2, p3));//0
return 0;
}
模拟实现
#include<stdio.h>
#include<assert.h>
int my_strcmp(const char* p1, const char* p2)
{
assert(p1 && p2);
while (*p1 == *p2)
{
if (*p1 == '\0')
{
return 0;
}
p1++;
p2++;
}
return *p1 - *p2;
}
int main()
{
char* p1 = "abcdef";
char* p2 = "abcd";
char* p3 = "abcd";
printf("%d\n", my_strcmp(p1, p2));//101
printf("%d\n", my_strcmp(p3, p2));//0
printf("%d\n", 'e');//101
return 0;
}
strncmp #include<string.h>
int strncmp (const char* str1, const char* str2, size_t num)
1.num 指要比较的数量,单位字节
2.其他功能和strcmp相同
3.尽管有num 的存在,但还是比较第一个 '\0' 前的内容
举例
#include<stdio.h>
#include<string.h>
int main()
{
char* p3 = "ab";
char* p1 = "abc";
char* p2 = "abc\0abc";
printf("%d\n", strcmp(p1, p2));//0
printf("%d\n", strncmp(p1, p2, 5));//0
printf("%d\n", strncmp(p1, p3, 2));//0
return 0;
}
最后拜托读者点赞,关注,收藏!!!!!!!!!