一、模拟实现strlen
1、字符串数组
C语言中是没有字符串这种类型,而我们通常叫字符串数组、它其实是连续的字符序列,最后以空字符'\0'作为终止符,一个字符串的长度就是所有字符的数量,但不包括终止符'\0'
// 模拟实现strlen()函数 size_t strlen(const char * str) size_t 表示 unsigned int
1.计数器版本
int my_strlen(char * str)
{
int count = 0;
while (*str != '\0')
{
count++;
str++;
}
return count;
}
2.递归版本
int my_strlen1(char* str)
{
if (*str != '\0')
{
return 1 + my_strlen1(str + 1);
}
else
{
return 0;
}
}
3.指针—指针
int my_strlen2(char* str)
{
char *endstr = str;
while (*str != '\0')
{
str++;
}
return str - str[0];
}
int main()
{
char str[] = "abcde";
int num = 0;
int num1 = 0;
int num2 = 0;
num = my_strlen(str);
num1 = my_strlen1(str);
num2 = my_strlen2(str);
printf("%d\n", num); // 5
printf("%d\n", num1); // 5
printf("%d\n", num2); // 5
return 0;
}
递归方法
二、模拟实现strcpy
将arr1复制到arr2
// char * strcpy(char * destination, const char* source)
my_strcpy(char*arr1, const char*arr2)
{
断言
assert(arr2 != NULL);
while (*arr1 = *arr2)//( *arr1++ = *arr2++)
{
arr1++;
arr2++;
}
}
int main()
{
char arr1[] = "abcdef";
char arr2[10] = {0};
strcpy(arr1, arr2);
my_strcpy(arr1, arr2);
printf("%s", arr2);
return 0;
}
三、模拟实现strcat和strncat
strcat(char * destination, const char* source) 字符串拼接,将str2的字符全部拼接到str1中
strncat(char * destination, const char* source,int count) 指定数量的字符拼接到arr1中
// char * strcat(char * destination, const char* source)
void my_strcat(char*str1, const char*str2)
{
assert(str1 && str2);
while (*str1)
{
str++;
}
while ((*str1 = *str2) != '\0')
{
str1++;
str2++;
}
}
mystrncat(char* str1, char* str2, size_t count)
{
while (*str1++) // 让指针指向 \0
{
;
}
str1--; // 让指针指向 \0 前一个字符
while (count--)
{
if ((*str1++ = *str2++) == 0)
{
return (str1);
}
}
// 当str2指定的几个字符不包括\0 例如 "abcd" 只追加3个字符 abc
// 也就是说str2没追加到'\0',自动补'\0'
*str1 = '\0';
return (str1);
}
int main()
{
char str1[20] = "hello ";
char str2[] = "world";
//my_strcat(str1, str2);
mystrncat(str1, str2, 3);
printf("%s", str1);
return 0;
}
三、模拟实现strcmp
// int strcmp(const char * str1, const char * str2)
// return arr1 < arr2 返回 -1 比较第一个字符
// return arr1 > arr2 返回 1
// return arr1 = arr2 返回 0
int my_strcmp(char* str1, char* str2)
{
while (*str1 == *str2)
{
if (*str1 == '\0')
{
return 0;
}
str1++;
str2++;
}
if (*str1 > *str2)
{
return 1;
}
else {
return -1;
}
return 0;
}
sys_strcmp(const char*str1, const char*str2)
{
int ret = 0;
while ((ret = *(unsigned char* )str1 - *(unsigned char* )str2) == 0 && *str2) // ret 为正数 str1 > str2
{ // 满足 *str1 - *str2 = 0 字符相等, *str2 不等于'\0'
++str1,++str2;
}
return ((-ret) < 1 )-(ret < 1); // -ret < 0 如果ret 为正数 -ret 为负数 则 -ret < 0 为 真 即为 1
}
int main()
{
char str[] = "abcdc";
char str2[] = "abcdc6d";
//int a = my_strcmp(str, str2);
int b = strcmp(str, str2);
int c = sys_strcmp(str, str2);
//printf("%d\n", a);
//printf("%d\n", b);
printf("%d\n", c);
return 0;
}