前言:
通过前面的博客,C语言基本知识基本上我已给大家分享完成!接下来我会通过两篇博客结
合前面的知识实现一下常见的函数。实现方式不唯一,大家只要大体思路符合都是可以的,在学习
的过程中尽量自己先实现,实现完成之后再对照我的思路进行再实现,然后回过头再进行对照一遍。
C语言大家已经学习好一段时间,接下来大家争取再消化一下,自己多敲一下代码,找一下练
习题。不要急于求成,入门和基础是非常重要的。有些知识要大家反复的去琢磨,通过敲代码进行
推敲验证。后面数据结构的学习我也会继续更新为大家分享相关知识点的总结。
1.strlen 函数的模拟实现
函数原型 -----size_t strlen ( const char * str )
思路: 函数的功能是求字符串长度,所以我们需要遍历字符串的每个字符并计数,最后将返回
值返回。传地址时我们不需要修改其所指向的对象,所以用const进行维护。
#include <stdio.h>
#define n 100
size_t my_strlen(const char* p)
{
int count = 0;
while (*p++)
count++;
return count;
}
int main()
{
char arr[n];
gets(arr);
printf("%d\n",my_strlen(arr));
return 0;
}
2.strcpy 函数的模拟实现
函数原型----char * strcpy ( char * destination, const char * source )
函数功能: 该函数的作用是将原字符串中的内容拷贝到目标字符串中(包括终止字符)。它的返
回值是char*,即就是目标字符串的地址。
思路: 先将目标字符串的地址保存下来,再逐个进行拷贝,最后返回目标字符串的地址。
#include <stdio.h>
#include <assert.h>
#define N 100
char* my_strcpy(char* dest, const char* sour)
{
assert(dest&&sour);
char* ret = dest;
while (*dest++ = *sour++) //这样设计是非常巧妙的,完成了拷贝也起到终止条件的作用
;
return ret;
}
int main()
{
char arr1[N] = "abcdef";
char arr2[N];
char* ret = my_strcpy(arr2, arr1);
printf("%s\n", ret);
return 0;
}
3.strcat 函数模拟实现
函数原型---char * strcat ( char * destination, const char * source )
函数功能:strcat 函数是 C 语言中的字符串连接函数,用于将一个字符串连接到另一个字符串的
末尾。返回值为目标字符串的地址。
思路:先将目标字符串的地址保存下来,其次先找目标字符串的尾部,在进行尾部拷贝连接,最后
返回目标字符串的地址。
#include <stdio.h>
#include <assert.h>
#define N 100
char* my_strcat(char* dest, const char* sour)
{
assert(dest && sour);
char* ret = dest;
//先找尾
while (*dest)//这里不能写成*dest++
dest++;
//连接
while (*dest++ = *sour++)
;
return ret;
}
int main()
{
char arr1[N] = "abcdef";
char arr2[N] = "ghijk";
char* ret = my_strcat(arr1, arr2);
printf("%s\n", ret);
return 0;
}
4.strstr 函数的模拟实现
思路:函数原型-------char * strstr ( char * str1, const char * str2 )
函数功能:该函数在`str1`字符串中查找`str2`字符串的第一个出现位置,如果`str2`是`str1`的子
串,它会返回`str2`在`str1`中的起始位置的指针;如果`str2`不是`str1`的组成部分,则返回空指针
`NULL`。
思路:
1.先判断str2是否为空,如果为空就返回。
2.定义一个标记当前从str1中哪个位置开始比较的指针cur,定义s1每次比较时始终为当前cur的位置,s2为str2的起始位置。
3.在cur,s1,s2没到尾部的情况下,s1和s2相等的话就继续向后走进行比较。
4.当s2走到尾部就返回cur所标记 开始比较的位置。
5.其他情况都返回空指针。
#include <stdio.h>
char* my_strstr(const char* arr1, const char* arr2)
{
char* s1 = NULL;
char* s2 = NULL;
char* cur = arr1;
if (*arr2 == '\0')
return (char*)arr1;
while (*cur)
{
s1 = cur;
s2 = arr2;
while (*s1 != '\0' && *s2 != '\0' && *s1 == *s2)
{
s1++;
s2++;
}
if (*s2 == 0)
return (char*)cur;
cur++;
}
return NULL;
}
int main()
{
char arr1[] = "ahjhjabh";
char arr2[] = "b";
char* ret = my_strstr(arr1, arr2);
if (ret == NULL)
printf("Ҳ\n");
else
printf("%s", ret);
return 0;
}