字符串是一个重要的数据类型,但是C语言并没有显式的字符串数据类型,因为字符串以字符常量的形式存储在字符数组之中。接下来我将要模拟实现处理字符串的库函数:strlen,syrcpy,strcat,strstr,strcmp,memcpy。
1、strlen返回一个int型的数据,是一个测试字符串长度的函数。
这是自己模拟实现strlen的功能
思想:字符串都有结束标志\0,只要遍历这个字符串,知道遇到\0结束,就能轻松的获得字符串的长度了
#include <stdio.h>
#include <stdlib.h>
int my_strlen(const char* str)
{
if (*str == '\0')
{
return 0;
}
else
{
int ret = (1 + my_strlen(str + 1));
return r`
t;
}
}int main()
{
const char* string = "hello";
printf("长度为:%d",my_strlen(string));
system("pause")`
return 0;
}
实现strlen函数的方法有很多,在这里我就只粘了一种递归实现的方法。
2、模拟实现strcpy,表示字符串复制函数,但是我觉得这个还是少用为好,因为必须要目的字符串给出足够大的空间,否则会产生不可预料的结果,strncpy比它好用很多,可以自己指定大小。
思想:将src字符串复制到dst上,由于dst参数是被修改的,所以他必须是一个字符数组或者是一个指向动态分配内存的数组的指针,不能使用字符串常量。新的字符串意\结尾,所以老字符串剩余的几个字符将会被有效地删除
#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
char *my_strcpy(char* str1, const char *str2)
{
assert(str1!=NULL);
assert(str2 != NULL);
char* ret = str1;
while ((*str1++ = *str2++))
{
;
}
return ret;
}
int main()
{
char string1[]="hehehhehe" ;//strcmp的目的字符串必须给足够大的空间,否则由于空间不够大而产生不可预料的结果
const char* string2 = "kitty";
printf("%s\n", my_strcpy(string1, string2));
system("pause");
return 0;
}
3、strcat的实现。strcat是把一个字符串添加到另外一个字符串的后面,思想:找到目的字符串的末尾将源字符串的一份拷贝添加到这个位置。
#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
char *my_strcat(char *dest, const char *src)
{
assert(dest!=NULL);
assert(src!=NULL);
char* ret = dest;
while (*dest)//遇到\0结束
{
dest++;
}
while ((*dest++ = *src++))
{
;
}
return ret;
}
int main()
{
char str1[12] = "hello";
const char* str2 = "world";
printf("%s\n", my_strcat(str1, str2));
system("pause");
return 0;
}
4、字符串比较函数。
思想:比较两个字符串就是对两个字符串的字符逐个进行比较,知道发现不匹配位置。由于strcmp不改变任何一个参数,所以不存在溢出字符数组的缺点,但是strcmp的参数必须要有结束标志符结尾,否则strcmp就有可能对参数后面的内容进行比较,这样得出来的结果没什么意义。
#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
int my_strcmp(const char* dst, const char* src)
{
int ret = 0;
while (!(ret = *(unsigned char*)dst - *(unsigned char*)src) && dst)
{
++dst;
++src;
}
if (ret > 0)
return 1;
else if (ret < 0)
return -1;
return ret;
}
int main()
{
char arr1[] = "abcdef";
char arr2[] = "abbdcef";
printf("%d", my_strcmp(arr1, arr2));
system("pause");
return 0;
}
5、模拟实现memcpy函数。
由于字符串函数遇到第一个NUL字节将停止工作,这就要求字符串内部不能包含任何NUL字节,但是字符串内部包含NUL字节的情况很常见,所以我们使用内存操作来解决这个问题。memcpy可以复制源字符串的n个字节到目的字符串中,使用这种方法可以复制任何类型的值;具体操作如下:
#include <stdio.h>
#include <stdlib.h>
void* my_memcpy(void* str1, const void* str2, size_t c)
{
void* ret = str1;
while (c--)
{
*(char*)str1 = *(char *)str2;
str1 = (char*)str1 + 1;
str2 = (char*)str2 + 1;
}
return ret;
}
int main()
{
char arr1[] = "aaaaaaaaaa";
char arr2[] = "bbbbbbbbbb";
int count = 5;
printf("%s\n", my_memcpy(arr1, arr2, count));
system("pause");
return 0;
}