仅供复习整理
一、strlen
size_t strlen(const char* str);
strlen函数是用来计算字符串中从头到'\0'之间有多少个字符(因为字符串是以'\0'结尾的)
模拟实现:
#include <stdio.h>
#include <assert.h>
size_t my_strlen(const char* str)
{
//因为下面直接解引用了,所以得判空
assert(str);
int count = 0;
while (*str != '\0')
{
count++;
str++;
}
return count;
}
二、strcpy
char* strcpy(char* destination, const char* sour)
将sour的数据拷贝到destination,包括'\0'
返回的是destination的首地址
模拟实现:
#include <stdio.h>
#include <assert.h>
char* my_strcpy(char* destination, const char* sour)
{
assert(destination && sour);
char* ret = destination;
while (*destination++ = *sour++)
{
;
}
return ret;
}
三、strcat
char * strcat ( char * dest, const char * sour );
将sour中的字符串复制并追加到dest中'\0'开始的位置。
模拟实现:
#include <stdio.h>
#include <assert.h>
char* my_strcat(char* dest, const char* sour)
{
char* res = dest;
assert(dest && sour);
//先找\0
while (*dest)
{
dest++;
}
while (*dest++ = *sour++)
{
;
}
return res;
}
四、strcmp
int strcmp ( const char * str1, const char * str2 );
用来比较两个字符串是否相等。
*str1 > *str2 返回 >0
*str1 < *str2 返回 <0
如果两个字符相等则返回0
模拟实现:
#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++;
}
return *str1 - *str2;
}
五、strstr
cosnt char * strstr (const char * str1, const char * str2);
用来判断str2是否在str1中出现过。
返回第一出现的位置。
模拟实现:
#include <stdio.h>
#include <assert.h>
char* my_strstr(const char* s1, const char* s2)
{
assert(s1 && s2);
int i = 0;
int j = 0;
while (s1[i] && s2[j])
{
if (s1[i] == s2[j])
{
i++;
j++;
}
else
{
i = i - j + 1;
j = 0;
}
}
if (s2[j] == '\0')
return s1 + i - j;
if (s1[i] == '\0')
return NULL;
}
六、memcpy
void * memcpy ( void * destination, const void * source, size_t num );
将source的num个字节拷贝到destination
注意!当两块内存空间重叠时,由于编译器,结果不能确定。此时可以使用memove
模拟实现:
#include <stdio.h>
#include <assert.h>
void* my_memcopy(void* dest, const void* sour, size_t num)
{
assert(dest && sour);
void* ret = dest;
while (num--)
{
//由于这里不考虑重叠情况,所以默认是不重叠
*(char*)dest = *(char*)sour;
dest = (char*)dest + 1;
sour = (char*)sour + 1;
}
return ret;
}
七、memmove
void * memmove ( void * destination, const void * source, size_t num );
功能与memcpy相似,带能处理内存重叠的情况,相当于升级版的memcpy.
模拟实现:
需要注意:内存重叠有两种情况!
void* my_memmove(void* dest, const void* sour, size_t num)
{
assert(dest && sour);
void* ret = dest;
if (dest > sour)
{
while (num--)
{
*(char*)dest = *(char*)sour;
dest = (char*)dest + 1;
sour = (char*)sour + 1;
}
}
else
{
while (num--)
{
*((char*)dest + num) = *((char*)sour + num);
}
}
return ret;
}
如有错误,欢迎指出~