@[TOC]字符串函数剖析) 标题
对于c语言中#include<string.h>,包含了许多的函数,接下来我将要介绍几种常用的库函数,并将他们用自己的方式实现。
一.长度不受限制的字符串函数包括
1.strlen(char )
2.strcpy(char dest,const char* src)
3.strcat(char* dest,const char* src)
4.strcmp(const char* str1,const char* str2)
二…长度受限制
1.strncpy
2.strncat
3.strncmp
三.常用的内存函数(修改的都是字节)
1.memcpy
2.memmove
3.memcmp
4.memset
首先介绍的是strlen函数,它是用来计算字符串的大小
代码实现有3种方法1.计数器的方法,2.递归,3.指针-指针
#include<stdio.h>
#include<string.h>
int my_strlen1(char* str)
{ int num=0;
while(*str!='\0')
{
num++;
str++;
}
return num;
}
my_strlen2(char* str)
{
if(str!='\0')
return 1+my_strlen2(str++);
else
return 0;
}
my_strlen3(char* str,int sz)
{
char* start=str;
char* end=str;
while(*end!='\0')
end++;
return end-start;
}
int main()
{ char arr[]="abcdef";
int ret=my_strlen3(arr);
printf("%s\n",arr);
return 0;
}
接下来实现strcpy函数,作用是复制字符串src到字符串dest中
char* my_strcpy(char* dest,const char* src)
{ assert(dest!=NULL);
assert(src!=NULL)
char* ret=dest; //记住被改变字符串的首地址
while(*dest++=*src++)
{
;
}
return ret;
3.strcat,将src字符串接到dest字符串的后面
my_strcat(char* dest,char* src)
//dest要比src大
{ char* ret=dest;
assert(dest&&src);
while(*dest!='\0')
dest++;
while(*dest++=*src++)
{
;
}
return ret;
}
4.strcmp,将字符串1与字符串2比较,字符串1大返正数,2大返负数,相等返回0
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);
}
二.长度受限制的字符串函数
1.strncpy,可以复制字符串str至字符串dest并且能指定几个字符
char* my_strncpy(char* dest,const char* src, size_t sum)
{
char* start = dest;
int i = 0;
while (sum && (*dest++ = *src++))
sum--;
if (sum)
while (--sum)
*dest++ = '\0';
return start;
}
2.strncat,可以追加字符串str至字符串dest并且能指定几个字符
char* strncat(char* dest,char* src,size_t num)
{
char* start=dest;
while(*dest++)
;
dest--;
while(num--)
if(!(*dest++=*src++))
return (start);
*dest='\0';
return (start);
}
3.strncmp,字符串比较函数
strstr,字符串查找函数,dest是src的子串
char *my_strstr(const char* p1, const char* p2)
{
assert(p1 != NULL);
assert(p2 != NULL);
char* s1 = NULL;
char* s2 = NULL;
char* cur = (char*)p1;
if (*p2 == '\0')
{
return p1;
}
while (*cur)
{
s1 = cur;
s2 = (char *)p2;
while ((*s1 != '\0') &&(*s2!='\0')&&*s1 == *s2)
{
s1++;
s2++;
}
if (*s2 == '\0')
{
return cur;
}
cur++;
}
}
三,内存函数
1.memcpy
void* my_memcpy(void* dest, const void* src, size_t num)
{
void* ret = dest;
assert(dest != NULL);
assert(src != NULL);
while (num--)
{
*(char*)dest = *(char*)src;
++(char*)dest;
++(char*)src;
}
return ret;
}
2.memmove,内存移动函数
void* my_memmove(void* dest, void* src, size_t num)
{
void* ret = dest;
assert(dest != NULL);
assert(src != NULL);
if (dest < src)
{ //前->后
while (num--)
{
*(char*)dest = *(char*)src;
++(char*)dest;
++(char*)src;
}
}
else
{
//后->前
while (num--)
{
*((char*)dest + num) = *((char*)src + num);
}
}
return ret;
}
memcmp,内存比较函数
memset,创造内存函数
本文详细介绍了C语言中<string.h>库的常用字符串和内存操作函数,包括strlen、strcpy、strcat、strcmp、strncpy、strncat、strncmp等的使用及自定义实现。同时,也涵盖了内存函数memcpy、memmove、memcmp和memset的讲解。通过对这些基本函数的理解和实践,有助于提升C语言编程能力。
465

被折叠的 条评论
为什么被折叠?



