包含一些应试需要注意的细节,希望能够帮助到大家。
感受一下,在字符串操作函数中,需要注意的还是要判断参数是否为空。做判断时,使用assert()断言,其用法在下文注释中标注。再加上指针的简单应用,其模拟也不难实现。
#include <stdio.h>
#include <assert.h>
//strlen 第一种
int my_strlen(const char* str)//此处const修饰 表示指向的内容不能被改变
{
if (str == NULL)
{
return -1;
}
int size = 0;
while (*str != '\0')
{
++size;
++str;
}
return size;
}
//strlen 第二种实现方式 不允许创建临时变量
//递归
int my_strlen(const char* str)
{
if (str == NULL)
{
return -1;
}
if (*str == '\0')
{
return 0;
}
return 1 + my_strlen(str + 1);
}
char* my_strcpy(char* dest, const char* source)
{
/*if (dest == NULL || source == NULL)
{
return NULL;
}*/
//assert 断言中填一个表达式 如果表达式值为真 断言通过 无事发生 如果为假 断言失败 引起程序奔溃
assert(source != NULL);
assert(source != NULL);
char* ret = dest;
while (*source != '\0')
{
*dest = *source;
++source;
++dest;
}
//strcpy 需要拷贝最终的\0
*dest = '\0'; //比较容易遗漏的
return ret;
}
//strcat 字符串拼接
char* my_strcat(char* dest, const char* src)
{
char* ret = dest;
//先找到结束位置 再进行拼接
assert(dest != NULL);
assert(src != NULL);
while (*dest != '\0')
{
++dest;
}
my_strcpy(dest, src);
return ret;
}
//strstr
char* my_strstr(const char* str1, const cahr* str2)
{
//通常情况下 不允许把一个const类型的指针赋值给非const类型的指针
const char* p = str1;
for (; *p != '\0'; ++p)
{
if (my_strcmp(p, str2)==0)
{
return p;
}
}
return NULL;
}
//strcmp
//memcpy
void* my_memcpy(void* dest, const void* src, size_t num)
{
assert(dest != NULL);
assert(src != NULL);
void* ret = dest;
for (size_t i = 0; i < num; ++i)
{
*(char*)dest = *(char*)src;
dest = (char*)dest + 1;
src = (char*)src + 1;
}
return ret;
}
//memmove
void* my_memmove(void* dest, const void* src, size_t num)
{
assert(dest != NULL);
assert(src != NULL);
assert(num != 0);
void* ret = dest;
//先判断两个区间是否重合
if (dest <= src || (char*)dest >= (char*)src + num)
{
//没有重合 按照正常思路拷贝
for (size_t i = 0; i < num; ++i)
{
*(char*)dest = *(char*)src;
dest = (char*)dest + 1;
src = (char*)src + 1;
}
}
else
{
//区间重合 反着拷
dest = (char*)dest + num - 1;
src = (char*)src + num - 1;
for (size_t i = 0; i < num; ++i)
{
*(char*)dest = *(char*)src;
dest = (char*)dest - 1;
src = (char*)src - 1;
}
}
return ret;
}