您的位置:首页 > 其它

和字符串有关的函数的模拟实现 strlen strcpy strcat strstr strcmp

2017-05-18 17:26 831 查看
strlen 函数原型:
size_t  strlen(const char* string);
功能: 计算字符串长度,遇到‘/0’停下;

#include<stdio.h>
#include<assert.h>
#include<stdlib.h>

//用计数器统计
int my_strlen(const char*str)
{
assert(str != NULL);
int count = 0;
//在遇到'/0'之前,指针向后挪动一次,count加1
while (*str++)
{
count++;
}
return count;
}

//利用指针相减
int my_strlen(const char*str)
{
assert(str != NULL);
char*pc = str;
//在遇到'/0'之前,通过指向向后挪动找到'/0',的地址
while (*pc++)
{
;
}
//'/0'址减去起始地址 为字符串长度
return pc - str-1;
}

//利用递归的方式实现
int my_strlen(const char*str)
{
assert(str != NULL);
if (*str == '\0')
{
return 0;
}
else
return 1 + my_strlen(str + 1);
}

int main()
{
const char *p = "abcdef";
int ret = my_strlen(p);
printf("%d\n",ret);
system("pause");
return 0;
}  //模拟实现strlen


strcpy 函数原型:
char * strcpy(char* strDestination,  const char *strSource);
功能:实现把src所指向地址空间的内容拷贝到dest指针开始指向地址空间 ,遇到'/0'结束拷贝.

#include<stdio.h>
#include<assert.h>
#include<stdlib.h>

char* my_strcpy(char* dest,const char* str)
{
assert(str != NULL);
assert(dest != NULL);
char*p = str;
while (*dest++ = *str++)
{
;
}
}

int main()
{
const char arr1[] = "abcdef";
char arr2[] = "aaaaaaaaaaa";
my_strcpy(arr2, arr1);
printf("%s\n", arr2);
system("pause");
return 0;
}//strcay的模拟实现


strcat 函数原型:
char * strcat(char* strDestination,  const char *strSource);
功能:把src所指向的字符串追加到dest所指向字符串的后面;
实现:找到dest所指向字符串的’/0‘的地址,将src的内容追加到后面,知道src所指向的内容指向’/0‘结束;

#include<stdio.h>
#include<assert.h>
#include<stdlib.h>

char* my_strcat(char*dest,const char*str)
{
assert(str != NULL);
assert(dest != NULL);
while (*dest++)
{
//为了得到目标字符串的\0
;
}
//dest现在指向的是\'0'后的一个空间,-1才能得到'\0'指向的空间
dest--;
//把源赋给目标,为'\0'的时候跳出循环
while(*dest++ = *str++)
{
;
}
}

int main()
{
char arr1[] = "abcd";
char arr2[] = "efgh";
my_strcat(arr1, arr2);
printf("%s\n", arr1);
system("pause");
return 0;
}    //strcat的模拟实现


strstr函数原型:
char * strstr(const char* strDestination,  const char *strSource);
功能: 在dest所指向内容里面找子字符串src,找到返回子字符串起始地址 ,找不到 返回NULL;

#include<stdio.h>
#include<assert.h>
#include<stdlib.h>

int my_strstr(const char*str1, const char*str2)
{
assert(str1 != NULL);
assert(str2 != NULL);
const char*s1 = str1;
const char*s2 = str2;
const char*p = str1;
while (*p != '\0')
{
//每次循环完了之后,给s1赋值p+1;保证s2和s1的第一个值进行比较
s1 = p;
//保证s2每次比较都是首元素开始的
s2 = str2;
while (*s1 == *s2)
{
s1++;
s2++;
}
//跳出循环有两种情况1. s2不等于s1  2. s2比较完了
if (*s2 == '\0')
{
return p;
}
p++;
}
return NULL;
}

int main()
{
const char arr1[] = "abbbcdef";
const char arr2[] = "bcd";
char* ret = my_strstr(arr1, arr2);
if (ret == NULL)
{
printf("NO\n");
}
else
{
printf("%s\n", ret);
}
system("pause");
return 0;
}   //strstr 的模拟实现


srtcpmp函数原型:
int  strcat(const  char* strDestination,  const char *strSource);
比较规则: 两个字符串从左至右逐个比较,按ASC||的值比较;遇到'/0'结束;
目标和源相等返回0;
目标大于源返回一个正数;
目标小于源返回一个负数;

#include<stdio.h>
#include<assert.h>
#include<stdlib.h>

int my_strcmp(const char*str1, const char* str2)
{
assert(str1 != NULL);
assert(str2 != NULL);
const char*s1 = str1;
const char*s2 = str2;
//如果两个字符串的首字符相等,判断源是不是到'/0',如果不是继续向后面找,如果是返回0
while (*s1 == *s2)
{
if (*s1 == '\0')
{
return 0;
}
s1++;
s2++;
}
//如果不相等,返回他们相减的结果
return *s1 - *s2;
}

int main()
{
const char*p1 = "abcdef";
const char*p2 = "abcdeef";
int ret = my_strcmp(p1, p2);
printf("%d\n", ret);
system("pause");
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
相关文章推荐