一些字符和字符串库函数操作模拟实现
Posted Suk_god
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了一些字符和字符串库函数操作模拟实现相关的知识,希望对你有一定的参考价值。
文章目录
库函数的模拟实现
模拟实现strlen
原型
size_t strlen ( const char * str );
size_t: unsigned int 无符号整型
模拟实现
//计数器方式
size_t my_strlen1(const char* str)
{
size_t count = 0;
while (*str)
{
count++;
str++;
}
return count;
}
//不创建临时变量的计数器方式
size_t my_strlen2(const char* str)
{
if (*str == '\\0')
return 0;
else
return (size_t)(1 + my_strlen2(str + 1));
}
//利用指针-指针方式获取长度
size_t my_strlen3(const char* str)
{
const char *p = str;
while (*p)
{
p++;
}
return (size_t)(p - str);
}
int main()
{
//strlen(const char * str)-->my_strlen(const char *str)
const char* str1 = "Hello world!";
printf("模拟实现strlen函数实例#\\n");
size_t len1 = my_strlen1(str1);
printf("The size of this string is %d,from my_strlen1\\n",len1);
size_t len2 = my_strlen2(str1);
printf("The size of this string is %d,from my_strlen2\\n", len2);
size_t len3 = my_strlen3(str1);
printf("The size of this string is %d,from my_strlen3\\n", len3);
printf("\\n");
system("pause");
return 0;
}
模拟实现strcpy
原型
char * strcpy ( char * destination, const char * source );
返回值类型为char*,操作过程是将source所指向的的内容拷贝到destination指向的存储单元
模拟实现
//将src的内容拷贝至dest
char * my_strcpy(char *dest, const char *src)
{
assert(src);
assert(dest);
char * begin = dest;
//只有一个等号,赋值语句,要拷贝就要将所有内容都拷贝进去,包括'\\0'
while (*dest++ = *src++);
return begin;
}
int main()
{
//strcpy(char *dest,const char* src)-->my_strcpy(char *dest,const char* src)
printf("模拟实现strcpy函数实例#\\n");
const char *str2 = "Enjoyment!";
char dest[] = " test Enjoyments ";
printf("before;%s\\n",dest);
char * ret1 = my_strcpy(dest, str2);
printf("after:%s\\n",ret1);
printf("\\n");
system("pause");
return 0;
}
模拟实现strcat
原型
char * strcat ( char * destination, const char * source );
模拟实现
char * my_strcat(char *dest, const char *src)
{
assert(dest);
assert(src);
char *ret = dest;
while (*dest)
{
dest++;
}
while (*dest++ = *src++);
return ret;
}
int main()
{
//char * strcat ( char * destination, const char * source )-->my_strcat(char*dest,const char *src);
printf("模拟实现strcat函数实例#\\n");
char dest2[] = "Hello bit!";
const char *str3 = "Enjoyment";
char *ret2 = my_strcat(dest2, str3);
printf("%s\\n",ret2);
printf("\\n");
system("pause");
return 0;
}
来看运行结果;
模拟实现strstr
原型
const char * strstr ( const char * str1, const char * str2 );
功能:在str1中找到第一次与str2所指内容匹配的位置,然后从这个位置向后输出str1所指向的内容
例如:
char *str1 = “abcdeabcda1234”;
char *str2 = “abcda”
调用strstr()函数之后,返回的就是“abcda1234”
模拟实现
char * my_strstr(const char *stra,const char *strb)
{
assert(stra);
assert(strb);
char *p = (char*)stra;
char *move_p = p;
char * sp = (char*)strb;
if (*strb == '\\0')
return NULL;
while (*p)
{
move_p = p;
sp = (char*)strb;
while (*sp && *sp == *move_p)
{
sp++;
move_p++;
}
if (*sp == '\\0')
return p;
p++;
}
}
int main()
{
//char * my_strstr(const char *str1, const char *str2)
printf("模拟实现strstr函数实例#\\n");
const char *str4 = "hellobitHelloBit1234";
const char *str5 = "Hello";
char *ret3 = my_strstr(str4, str5);
printf("%s\\n",ret3);
printf("\\n");
system("pause");
return 0;
}
模拟实现strcmp
原型
int strcmp ( const char * str1, const char * str2 );
此函数用于比较两个字符串是否相等,若相等返回0,若str1>str2,返回1,若str1<str2,返回值为-1
模拟实现
int my_strcmp(const char * str1, const char * str2)
{
int ret = 0;
assert(str1);
assert(str2);
while (!(ret = (unsigned int)*str1 - (unsigned int)*str2) && *str1)
{
str1++;
str2++;
}
if (ret < 0)
return - 1;
else if (ret>0)
return 1;
else
;
return ret;
}
int main()
{
// int my_strcmp(const char * str1, const char * str2)
printf("模拟实现strcmp函数实例#\\n");
const char *str6 = "my_strcmp实现";
const char *str7 = "my_strcmp实现";
int ret4 = my_strcmp(str6, str7);
if (ret4 == 0)
printf("str6=str7\\n");
else if (ret4 == -1)
printf("str6<str7\\n");
else
printf("str6>str7\\n");
printf("\\n");
system("pause");
return 0;
}
模拟实现memcpy
原型
void * memcpy ( void * destination, const void * source, size_t num );
将source所指的内容拷贝到destination所指处,拷贝的大小为num个字节。注意,此函数是按照内存的最小访存单位字节来进行操作的。
模拟实现
void * my_memcpy(void * dest, const void * src, size_t num)
{
assert(dest);
assert(src);
char *_dest = (char *)dest;
char*_src = (char *)src;
if (_dest > _src&&_dest < _src + num)
{
_dest = _dest + num - 1;
_src = _src + num - 1;
while (num--)
{
*_dest = *_src;
_dest--;
_src--;
}
}
else
{
while (num--)
{
*_dest = *_src;
_dest++;
_src++;
}
}
return dest;
}
int main()
{
// void * memcpy(void * dest, const void * src, size_t num)
printf("模拟实现memcmp函数实例#\\n");
char str8[64] = "hello bit!";
const char * str9 = "my_memcpy 函数执行了!";
my_memcpy(str8, str9, strlen(str9));
printf("%s\\n",str8);
system("pause");
return 0;
}
模拟实现memmove
原型
void * memmove ( void * destination, const void * source, size_t num );
memmove()和memcpy()目前在功能上没有差异。他们两的实现代码一样,在这里就不再展示模拟实现。具体可以参考memcpy
的实现代码
以上就是基本的库函数模拟,以后会不定期更新~~
如果对你有所帮助,三连支持走一波儿~
以上是关于一些字符和字符串库函数操作模拟实现的主要内容,如果未能解决你的问题,请参考以下文章