C语⾔模拟实现字符串操作函数
在编写程序过程中,我们经常使⽤到⼀些字符串函数,例如求字符串长度,拷贝字符串……,这些函数都在C标准库中存在,我们可以直接使⽤。但我们还需要掌握这些函数的实现⽅法,今天来看看⼀些常⽤的字符串操作函数的实现⽅法
1. strlen
strlen是⽤来求字符串长度的函数,字符串长度就是字符串中包含的字符的个数,但是不包含字符串结尾的 ‘\0’
实现strlen有三种⽅法:
(1)定义⼀个计数器
size_t mystrlen(const char* str)
{
size_t count = 0;
while (*str != '\0')
{
count++;
str++;
}
return count;
}
(2)递归版本
size_t my_strlen(const char *str)
{
if (*str == '\0')
return0;
else
return my_strlen(str + 1) + 1;
}
(3)利⽤指针 - 指针
size_t mystrlen(const char* str)
{
const char* end = str;
while (*end++)
;
return end - str - 1;
}
2.strcpy
⽤于复制字符串的函数是strcpy,它的原型如下:
char* strcpy ( char* dest, const char* src );
使⽤这个函数时,要注意⼏点
(1)⽬标字符数组的空间必须⾜够⼤,⾜以容纳需要复制的字符串
(2)⽬标字符数组要可以被修改
(3)被复制的字符串要可以到’\ 0’
char *res = dest;
assert(dest);
assert(src);
while (*dest++ = *src++) //注意这⾥是⼀个等号
;
return res;
}
3.strcat
strcat函数是可以把⼀个字符串添加(连接)到另⼀个字符串的后⾯。strcat函数要求dest参数原先已经包含了⼀个字符串(可以是空字符串)。它到这个字符串的末尾,并把src字符串的⼀份拷贝添加到这个位置。
char *mystrcat(char *dest, const char *src)
{
char *res = dest;
assert(dest);
assert(src);
while (*dest != '\0')
dest++;
while (*dest++ = *src) //这⾥同样也是⼀个等号
;
return res;
}
4.strcmp
strcmp⽤于⽐较两个字符串,及对两个字符串对应的字符逐个进⾏⽐较,直到发现不匹配。那个最先不匹配的字符中较“⼩”的那个字符所在的字符串被认为“⼩于”另外⼀个字符串。如果其中⼀个字符串是另外⼀个字符串的前⾯⼀部分,那么它也被认为“⼩于”另外⼀个字符串,因为它的’\0’出现的更早。
int my_strcmp(const char* src1, const char* src2)
{
while (*src1 == *src2)
{
if (*src1 == '\0')
return0;
src1 ++;
src2 ++;
}
return *src1 - *src2;
}
5.strstr
为了在⼀个字符串中查⼀个⼦串,可以使⽤strstr函数,该函数是在s1中查整个s2第1次出现的起始位置,并返回⼀个指向该位置的指针。如果s2并没有出现在s1的任何地⽅,函数将返回⼀个NULL指针。如果第⼆个函数是⼀个空字符串,函数就返回s1。
const char* q = s2;
char* cur = NULL;
assert(s1);
assert(s2);
if (*s2 == '\0')
return s1;
while (*p != '\0')
{
cur = p;
while ((*p != '\0') && (*q != '\0') && (*p == *q))
{
p++;
q++;
}字符串比较函数实现
if (*q == '\0')
return cur;
p = cur + 1;
q = s2;
}
return NULL;
}
6.strchr
strchr是⽤来查⼀个特定的字符,在字符串str中查字符ch第⼀次出现的位置,到后函数返回⼀个指向该位置的指针。如果该字符并不存在于字符串中,函数就返回⼀个NULL指针
char* my_strchr(const char* str, char ch)
{
const char* tmp = str;
while (*tmp)
{
if (*tmp == ch)
return tmp;
tmp++;
}
return NULL;
}
7.strrchr
与strchr类似的查函数还有⼀个是strrchr,它和strchr的不同之处在于,该函数返回的是⼀个指向字符串中该字符最后⼀次出现的位置
assert(str);
while (*str)
{
if (*str == ch)
{
pos = str;
}
str++;
}
if (pos != 0)
{
return pos;
}
else
return NULL;
}
长度受限制的字符串函数
标准库中还包含⼀些函数,它们以⼀种不同的⽅式去处理字符串。这些函数接受⼀个显⽰的长度参数,⽤于限定进⾏复制或⽐较的字符数。
1.strncpy
和strcpy⼀样,strncpy()函数把源字符串的字符复制到⽬标空间,但是,它总是正好向dest中拷贝len个字符,如果strlen的(src)的值⼩于len,dest数组就⽤额外的’\0’填充到len字节长度。如果strlen的(src)的值⼤于或等于len,那么只有len个字符被复制到⽬标寄存器中。
char* my_strncpy(char* dest, const char* src, size_t len)
{
char* res = dest;
assert(dest);
assert(src);
while (len--)
{
*res++ = *src++;
}
if (*(res) != '\0')
*res = '\0';
return dest;
}
2.strncat
strncat函数,它从src中最多复制的len个字符到⽬标数组的后⾯。
char* my_strncat(char* dest, const char* src, size_t len)
{
char* res = dest;
assert(dest);
assert(src);
while (*dest != '\0')
dest++;
while (len--)
{
*dest = *src;
dest++;
src++;
}
return res;
}
3.strncmp
strncmp也⽤于⽐较两个字符串,但它最多⽐较len个字节。如果两个字符串在第len个字符之前存在不相等的字符,这个函数就像的strcmp⼀样停⽌⽐较,返回结果。如果两个字符串的前len个字符相等,函数就返回零。
int my_strncmp(const char* s1, const char* s2, size_t len)
{
assert(s1);
assert(s2);
while (len--)
{
if (*s1 == *s2)
{
s1++;
s2++;
}
else
return *s1 - *s2;
}
return0;
}
标准库⾥的字符串函数还有很多,今天就先介绍到这⾥。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论