strlen函数
函数声明:
size_t strlen(const char*string)
用于计算字符串的长度(不包括\0),返回值为size_t类型,返回字符串的长度(不包括\0)
模拟实现strlen
使用计数器的方法模拟实现
size_t My_strlen(const char* str) {
assert(str != NULL);
int count=0;
while (*str!= '\0') {
str++;
count++;
}
return count;
}
int main() {
char str[]= "abcde";
printf("%d", My_strlen(str));
}
运行结果:
strcpy函数
函数声明:
char* strcpy(char* dest,const char* src)
功能为将src字符串拷贝到dest中(\包括字符串结束符),dest的空间要足够大能容纳下src的内容,防止溢出。
模拟实现strcpy
char* My_strcpy(char* dest, const char* src) {
assert(dest != NULL);
assert(src != NULL);
while (*src != '\0') {
*dest = *src;
dest++;
src++;
}
return dest;
}
int main() {
char dest[1024] = " ";
char src[100] = "abcde";
printf("%s", My_strcpy(dest, src));
}
运行结果:
memmove函数
函数声明:
void* memmove(void* dest,const void* src,size_t num)
用于从src中拷贝num个任意类型内容到dest,若目标区域和源区域有重叠,memmove你能保证在源串被覆盖前将重叠部分拷贝到目标区域。由于现在计算机当中几乎不会出现内存重叠的现象,所以极少被用到。
模拟实现memmove
void* My_memmove(void* dest, const void* src, size_t num) {
assert(dest!= NULL);
assert(src != NULL);
char* p1 = (char*)dest;
char* p2 = (char*)src;
void* p = p1;
if (p1>= p2 && p1 < (p2 + num)) {
p1 = p1 + num - 1;
p2 = p2 + num - 1;
while (num--) {
*p1 = *p2;
p1--;
p2--;
}
}
else {
while (num--) {
*p1 = *p2;
p1++;
p2++;
}
}
return p;
}
int main() {
char str[] = "aaa bbb ccc ddd eee fff ";
printf("%s", My_memmove(str+8, str, 11));
}
运行结果:
memcpy函数
函数声明:
void* memcpy(void* dest,const void* src,size_t num)
函数的功能是从src所指的内存地址的起始位置开始拷贝n个字节到目标dest所指的内存地址的起始位置中。
模拟实现memcpy
void* My_memcpy(void* dest,const void* src,size_t num) {
assert(dest != NULL);
assert(src != NULL);
char* p1 = (char*)dest;
char* p2 = (char*)src;
while (num != 0) {
*p1 = *p2;
p1++;
p2++;
num--;
}
return dest;
}
int main() {
char dest[50]=" ";
char src[] = "abcdefg";
printf("%s", My_memcpy(dest, src, 7));
}
运行结果:
strstr函数
函数声明:
char* strstr(const char* str1,const char* str2)
strstr函数用于找到字串str2在字符串str1中第一次出现的位置,如果未找到则返回NULL,找到了返回str2在str1中第一次出现的地址。
模拟实现strstr
char* My_strstr(const char* str1,const char* str2) {
assert(str1 != NULL);
assert(str2 != NULL);
char* p1 = str1;
char* p2 = str2;
char* head = p1;
char* n = p2;
int count=0;
while (1) {
if (*p1 != *p2) {//str1=abcdef,str2=cde
if (count == 1) {
return NULL;
}
p1++;
}
while (*p1 == *p2) {
if (count == 0) {
head = p1;
count = 1;
}
p1++;
p2++;
if (*p1 == '\0') {
if (*p2 =='\0') {
return head;
}
return NULL;
}
if (*p2 == '\0') {
return head;
}
}
p2 = n,count=0;
}
}
int main() {
char str1[] = "abcbcdef";
char str2[] = "cde";
printf("%s", My_strstr(str1, str2));
}
运行结果:
strcat函数
函数声明:
char* strcat(char* dest,const char* src)
功能为在字符串dest后拼接上字符串src,dest的空间必须足够大能够容下拼接后的大小。
模拟实现strcat
char* My_strcat(char* dest, const char* src) {
assert(dest != NULL);
assert(src != NULL);
int* p = dest;
while (*dest != '\0') {
dest++;
}
while (*src != '\0') {
*dest = *src;
dest++;
src++;
}
return p;
}
int main() {
char dest[60] = "i am ";
char src[] = "iron man";
printf("%s", My_strcat(dest, src));
}
运行结果:
strcmp函数
函数声明:
extern int strcmp(const char* str1,const char* str2)
用于比较两个字符串并根据比较结果返回整数。当str1<str2时,返回为负数;当str1=str2时,返回值= 0;当str1>str2时,返回正数。两个字符串自左向右逐个字符相比(按ASCII值大小相比较),直到出现不同的字符或遇’\0’为止。
模拟实现strcmp
int My_strcmp(const char* str1, const char* str2) {
assert(str1 != NULL);
assert(str2 != NULL);
while (*str1 == *str2) {
if (*str1 == '\0') {
return 0;
}
str1++;
str2++;
}
return *str1 - *str2 ;
}
int main() {
char str1[] = "abcdef";
char str2[] = "bbcdef";
printf("%d",My_strcmp(str1,str2) );
}
运行结果: