一、strlen
1、函数介绍
求字符串长度
size_t strlen ( const char * str );
1.字符串已经 '\0' 作为结束标志,strlen函数返回的是在字符串中 '\0' 前面出现的字符个数(不包含 '\0' )。
2.参数指向的字符串必须要以 '\0' 结束。
3.注意函数的返回值为size_t,是无符号的。(strlen是求字符串长度的,求出长度是不可能为负数的,两个strlen求出的结果始终为正)。
2、代码实现
方法一(最常想到的方法):
#include<stdio.h>
#include<assert.h>
//模拟实现strlen
size_t my_strlen(const char* str)
{
assert(str != NULL);
int count = 0;
while (*str != '\0')
{
count++;
str++;
}
return count;
}
方法二(递归实现):
#include<stdio.h>
#include<assert.h>
size_t my_strlen(const char* str)
{
assert(str != NULL);
if (*str != '\0')
{
return 1 + my_strlen(str + 1);
}
else
return 0;
}
int main()
{
char arr[] = "abcdef";
int len = my_strlen(arr);
printf("%d\n", len);
return 0;
}
方法三(指针减指针):
#include<stdio.h>
#include<assert.h>
size_t my_strlen(const char* str)
{
assert(str != NULL);
const char* start = str;
while (*str)
{
str++;
}
return str - start;
}
int main()
{
char arr[] = "abcdef";
int len = my_strlen(arr);
printf("%d\n", len);
return 0;
}
二、strcpy
1、函数介绍
字符串复制
char* strcpy(char * destination, const char * source );
1、源字符串必须以 '\0' 结束。
2、会将源字符串中的 '\0' 拷贝到目标空间。
3、目标空间必须足够大,以确保能存放源字符串。
4、目标空间必须可变
2、代码实现
#include<stdio.h>
#include<assert.h>
char* my_strcpy(char* dest, const char* src)
{
assert(dest && src);
char* ret = dest;
while (*dest++ = *src++)
{
;
}
return ret;
}
int main()
{
char arr1[20] = "";
char arr2[] = "hello world";
my_strcpy(arr1, arr2);
printf("%s", arr1);
return 0;
}
三、strcat
1、函数介绍
字符串追加
char * strcat ( char * destination, const char * source );
1、源字符串必须以 '\0' 结束。
2、目标空间必须有足够的大,能容纳下源字符串的内容。
3、目标空间必须可修改。
2、代码实现
#include<stdio.h>
#include<assert.h>
char*my_strcat(char* dest, const char* src)
{
assert(dest && src);
char* ret = dest;
//找\0
while (*dest != '\0')
{
dest++;
}
//追加
while (*dest++ = *src++)
{
;
}
return ret;
}
int main()
{
char arr[20] = "hello ";
my_strcat(arr, "world");
printf("%s", arr);
return 0;
}
四、strcmp
1、函数介绍
字符串比较
int strcmp ( const char * str1, const char * str2 );
1、第一个字符串大于第二个字符串,则返回大于0的数字
2、第一个字符串等于第二个字符串,则返回0
3、第一个字符串小于第二个字符串,则返回小于0的数字
2、代码实现
#include<stdio.h>
#include<assert.h>
int my_strcmp(const char* str1, const char* str2)
{
assert(str1 &&str2);
while (*str1 == *str2) {
if (*str1 == '\0')
{
return 0;
}
str1++;
str2++;
}
/*if (*str1 > *str2)
return 1;
else
return -1;*/
return *str1 - *str2;
}
int main()
{
char arr1[] = "abc";
char arr2[] = "abcdef";
int ret = my_strcmp(arr1, arr2);
if (ret > 0)
printf("str1>str2");
else if(ret==0)
printf("str1=str2");
else
printf("str1<str2");
}
五、strstr
1、函数介绍
在字符串中查找另一字符串
char * strstr ( const char *str1, const char * str2);
1、返回指向 str1 中第一次出现的 str2 的指针,如果 str2不是str1 的一部分,则返回一个空指针。
2、匹配过程不包括终止空字符,但它到此为止
2、代码实现
#include<stdio.h>
#include<assert.h>
char* my_strstr(const char* str1, const char* str2)
{
assert(str1 && str2);
if (*str2 == '\0')
{
return (char*)str1;
}
const char* s1 = NULL;
const char* s2 = NULL;
const char* cp = str1;
while (*cp)
{
s1 = cp;
s2 = str2;
while (*s1 !='\0' && *s2!='\0' && *s1 == *s2)
{
s1++;
s2++;
}
if (*s2 == '\0')
{
return (char*)cp;
}
cp++;
}
return NULL;
}
int main()
{
char arr1[] = "abbccdef";
char arr2[] = "bc";
char* ret = my_strstr(arr1, arr2);
if (ret ==NULL)
{
printf("找不到");
}
else
{
printf("%s\n", ret);
}
return 0;
}