模拟 strlen 计算字符串个数
strlen 函数的参数
size_t strlen ( const char * str );
- strlen 是计算字符个数
- strlen 是计算 ‘\0’ 之前的字符的长度
代码实现:
方法一
以计数的方式计算
int my_strlen(char* str)
{
int count = 0;
while (*str)
{
str++;
count++;
}
return count;
}
int main()
{
char arr[] = {
"abcdef" };
int ret = my_strlen(arr);
printf("%d\n", ret);
return 0;
}
方法二
不能创建临时变量
以函数递归的方式计算
int my_strlen(char* str)
{
if (*str == 0)
return 0;
else
return 1 + my_strlen(str+1);
}
int main()
{
char arr[] = {
"abcdef" };
int ret = my_strlen(arr);
printf("%d\n", ret);
return 0;
}
方法三
以指针 - 指针的方式计算
int my_strlen(char* str)
{
char* q = str;
while (*q)
{
q++;
}
return q - str;
}
int main()
{
char arr[] = {
"abcdef" };
int ret = my_strlen(arr);
printf("%d\n", ret);
return 0;
}
模拟 strcpy 字符串拷贝
strcpy 函数的参数
char* strcpy(char * destination, const char * source );
- strcpy 是字符串拷贝函数
- strcpy 里的第一个参数是拷贝的
目标空间
,第二个参数是拷贝的内容
- 注意
1.拷贝的目标空间必须足够大,拷贝后能够存放字符串
2 参数的顺序
3
代码实现:
#include<assert.h>
char* my_strcpy(char* arr, const char* str)
{
char* s = str;
assert(arr);
assert(str);
while (*arr++ = *str++)
{
;
}
return s;
}
int main()
{
char arr[] = {
"#####################" };
char str[] = {
"hello china!" };
printf("%s\n", my_strcpy(arr, str));
return 0;
}
模拟 strcat 字符串追加
函数的参数
char * strcat ( char * destination, const char * source );
- strcat 函数会在字符串最后位 ‘\0’ 的位置添加字符串
代码实现:
char* my_strcat(char* arr, char* str)
{
char* s = arr;
assert(arr && str);
while (*arr)
{
arr++;
}
while (*arr++ = *str++)
{
;
}
return s;
}
int main()
{
char arr[15] = {
"hello " };
char str[] = {
"china!" };
my_strcat(arr, str);
printf("%s\n", arr);
}
模拟 strcmp 字符串比较
strcmp 函数的参数
int strcmp ( const char * str1, const char * str2 );
- strcmp 是一个一个字符比较
相等返回0
第一个字符串大于第二个字符串,返回大于0的数字
第一个字符串小于第二个字符串,则返回小于0的数字
代码实现:
int my_strcmp(const char* arr, const char* str)
{
assert(arr && str);
while (*arr == *str && *str)
{
if (*arr == '\0')
{
return 0;
}
arr++;
str++;
}
return *arr - *str;
}
int main()
{
char arr[] = {
"abcde" };
char str[] = {
"abd" };
int ret = my_strcmp(arr, str);
if (ret > 0)
printf("arr > str");
else if (ret < 0)
printf("arr < str");
else
printf("arr == str");
}
模拟 strncpy 长度限制字符串拷贝
strncpy 函数的参数
char * strncpy ( char * destination, const char * source, size_t num );
- strncpy 可能只会拷贝字符串的某一段,也就有可能不拷贝 ‘\0’ ,所以在实现的时候必须要注意
代码实现:
char* my_strncpy(char* arr, const char* str, size_t num)
{
assert(arr && str);
char* s = str;
while (num--)
{
*arr++ = *str++;
}
*arr++ = '\0';
return s;
}
int main()
{
char arr[] = {
"#####################" };
char str[] = {
"hello china!####" };
my_strncpy(arr, str, 5);
printf("%s\n",arr);
return 0;
}
模拟 strncat 字符串追加
strncat 函数参数
char * strncat ( char * destination, const char * source, size_t num );
代码实现:
char* my_strncat(char* arr, char* str, size_t num)
{
assert(arr && str);
char* s = arr;
while (*arr++)
{
;
}
//寻找到 *arr 为 '\0' 又进行了一次 ++
//所以这里需要 -- 找到 '\0' 真正位置
arr--;
while (num--)
{
*arr++ = *str++;
}
*arr++ = '\0';
return s;
}
int main()
{
char arr[20] = {
"hello " };
char str[] = {
"china! For a dettet tomorrow!" };
my_strncat(arr, str, 6);
printf("%s\n", arr);
return 0;
}
模拟 strncmp 字符串比较
strncmp 函数参数
int strncmp ( const char * str1, const char * str2, size_t num );
- 实现的方式和strcmp 都是一样的,只是加多了一个参数
代码实现:
int my_strncmp(char* arr, char* str, size_t num)
{
while (num-- && (*arr - *str == 0) && *str)
{
arr++;
str++;
}
if (*arr > *str)
return 1;
else if (*arr < *str)
return -1;
else
return 0;
}
int main()
{
char arr[10] = {
"abcde" };
char str[10] = {
"abyaa" };
int ret = my_strncmp(arr, str, 3);
if (ret > 0)
printf("arr > str");
else if (ret < 0)
printf("arr < str");
else
printf("arr == str");
return 0;
}
模拟 strstr
strstr 函数参数
char * strstr ( const char *str1, const char * str2);
- 作用:在A 字符串中查找是否包含 B字符串
如果 A 中包含 B ,则返回 B 在 A 中首次出现的的地址。
否则返回空指针! - 如果找到,返回的是字符串的地址,所以要用指针变量来接收
代码实现:
char* my_strstr(const char* arr, const char* str)
{
char* xp = arr;
char* s1 = 0;
char* s2 = 0;
while (*xp)//如果 *xp 为0了,证明 arr 中 不包含 str
{
s1 = xp;
s2 = str;
while (*s1 && *s2 && ( *s1 - *s2 == 0))//只有 *s1 *s2 且 *s1 *s2 相等时才进行查找
{
s1++;
s2++;
}
if (*s2 == '\0')
return xp;
xp++;//如果 s2 没有找完,那么 xp 进入下一个位置继续查找
}
return NULL;
}
int main()
{
char arr[] = {
"abcdefg" };
char str[] = {
"cdb" };
printf("%s\n", my_strstr(arr, str));
}
转载:https://blog.csdn.net/m0_66483195/article/details/125463933
查看评论