strlen函数
strlen函数被包含在<string.h>头文件内,是用来计算字符长度的库函数。
size_t strlen(const cahr*p);返回值时size_t是因为长度不会是负数,参数加const是因为我们只是要计算长度,并不去改变地址内的内容。
作用原理是将字符串首元素的地址传给strlen,strlen函数则从此地址开始向后读,直到遇到’\0’停下,并返回读取到的字符的个数。strlen函数返回的结果是不计算’\0’在内的字符个数。
#include <stdio.h>
#include <string.h>
int main()
{
char str[] = "hello world";
printf("%d\n", strlen(str));
char str1[] = "hello\0world";
printf("%d\n", strlen(str1));
return 0;
}
相信对第一个结果没有问题,但第二个结果为什么是5?是因为在hello和world之间有一个’\0’strlen函数在读到’\0’时就会停下来,返回之前记录到的字符个数。
strlen的模拟实现
#include <stdio.h>
#include<assert.h>
size_t My_strlen(const char*p)
{
assert(p);
int count = 0;
while (*p != '\0')
{
p++;
count++;
}
return count;
}
int main()
{
char str[] = "hello world";
printf("%d",My_strlen(str));
return 0;
}
strcpy函数
strcpy函数也在<string.h>头文件内。strcpy函数的作用是将一段字符复制到另一端空间内。
char* strcpy(char* p1,const char* p2);
strcpy函数返回值是字符串被复制的目的空间的地址,第一个参数是目的空间,第二个参数是要复制的字符串空间的地址。复制时空间要足够,否者会复制失败。
#include<stdio.h>
#include <string.h>
int main()
{
char arr[20];
char str[] = "hello";
strcpy(arr, str);
printf("%s\n", arr);
}
接下来我们来模拟实现strcpy。
#include <stdio.h>
char* My_strcpy(char* p1,const char* p2)
{
char* tem = p1;
while (*p1++ = *p2++)
{
;
}
return tem;
}
int main()
{
My_strcpy();
return 0;
}
while (*p1++ = *p2++);我们来分析一下这段代码。先将p2内的值赋给p1,然后判断这个p1的值,如果p1被赋值为’\0′,那么循环就会停止,返回新空间的地址。’\0’的ASCII值为0,所以当字符串读取到’\0’后就会停止。
strcmp函数
strcmp函数的作用是比较字符串是否相同,原理是比较相同位置上的字符的ASCII值。如果字符串相同就会返回0.也位于<string.h>。
int strcmp(const char* p1;const char* p2);
#include <stdio.h>
#include <string.h>
int main()
{
char arr1[] = "hello";
char arr2[] = "hello";
char arr3[] = "hell";
printf("%d\n", strcmp(arr1, arr2));
printf("%d\n", strcmp(arr1, arr3));
return 0;
}
模拟strcmp函数。
#include <stdio.h>
int My_strcmp(const char* p1,const char* p2)
{
while (*p1 != '\0' && *p2 != '\0' && *p1 == *p2)
{
p1++;
p2++;
}
return *p1 - *p2;
}
int main()
{
char arr1[] = "hello";
char arr2[] = "hello";
char arr3[] = "hell";
printf("%d", My_strcmp(arr1, arr2));
printf("%d", My_strcmp(arr1, arr3));
return 0;
}
strcmp函数相同返回0,其他情况只是要求返回正数和负数就行。
strcat函数
stract函数的作用是将一段字符串拼接在另一段字符串后面。同样位于<string.h>内。拼接同样空间也要足够,否则会失败。
char* strcat(char* p1,const char* p2);
#include <stdio.h>
#include <string.h>
int main()
{
char arr1[20] = "hello ";
char arr2[] = "world";
strcat(arr1, arr2);
printf("%s\n", arr1);
}
模拟实现strcat
#include<stdio.h>
char* My_strcat(char* p1,const char* p2)
{
char* tem = p1;
while (*p1)
{
p1++;
}
while (*p1++ = *p2++)
{
;
}
return tem;
}
int main()
{
char arr1[20] = "hello ";
char arr2[] = "world";
printf("%s\n", My_strcat(arr1, arr2));
return 0;
}
strstr函数
这函数是用来判断字符串str2是否是str1的子串,返回字串的地址。
char* strstr(const char* p1,const char* p2 );
#include<string.h>
#include<stdio.h>
main()
{
char* string1 = "needle in haystack";
char* string2 = "hay";
printf("%s\n",strstr(string1, string2));
return 0;
}
看模拟代码
#include <stdio.h>
char* My_strstr(const char* p1,const char* p2)
{
char* s2 = p2;
while (*p1)
{
char* s1 = p1;
while (*p1 == *p2 && *p1 != '\0' && *p2 != '\0')
{
p1++;
p2++;
}
if (*p2 == '\0')
{
return s1;
}
p1 = s1;
p2 = s2;
p1++;
}
return NULL;
}
int main()
{
char arr[] = "abivgdauk";
char arr1[] = "hfd";
char arr2[] = "da";
printf("%s\n", My_strstr(arr, arr1));
printf("%s\n", My_strstr(arr, arr2));
return 0;
}
这个函数就是通过指针先将两个字符的首字符比较,如果不相同,那么母串就向后移一位继续比较。还有一种可能,第一个字符相等,后面又不等,那么我们就要回到母串开始比较之前的位置,所以在第一个字符比较相同后,我们需要记录此时母串的位置,才开始比较。也就是上面代码中的s1.