一、strlen函数的使用以及模拟实现
在使用字符串函数strlen求字符串长度的时候,往往会用#include<string.h>中的内置函数,但是,你知道strlen函数怎么模拟实现的嘛,这里给出了两种方法,
第一种,是从第一个字符开始,找到最后一个字符后面字符的指针(最后一个字符的后面是一个'\0'),然后借用指针指向的关系,最后一个字符的下一个指针-第一个字符的指针=字符串长度。
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
//方法一:
int my_strlen(char* str1)
{
char* ret = str1;
while (*str1 != '\0')
{
str1++;
}
return str1 - ret;
}
int main()
{
char str1[] = "abcdef";
int ans = my_strlen(str1);
printf("%d", ans);
return 0;
}
第二种方法,利用的是函数的递归实现的。首先递归出口就是'\0',当字符串遇到'\0'时,字符串跳出递归,当字符不是'\0'时,1+my_len(下一个字符的指针)。
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
int my_strlen(char* str1)
{
if (*str1 == '\0')
return 0;
else
return 1 + my_strlen(str1+1);
}
int main()
{
char str1[] = "abcdef";
int ans = my_strlen(str1);
printf("%d", ans);
return 0;
}
二、strcmp和strncmp的使用和模拟实现及区别
1.strcmp是一个字符串比较函数,比较两个字符串的各自对应字符的大小。
2.strncmp多了一个参数,num,比较俩个字符串的前num个字符,用法和strcmp一样,只不过前提条件变成了比较前num个字符。
模拟实现strcmp:
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
int my_strcmp(const char* str1, const char* str2)
{
while (*str1 == *str2)
{
if (*str2 == '\0') //相同的时候,判断是否都为'\0'
return 0;
str1++;
str2++;
}
return *str1 - *str2;
}
int main()
{
char str1[] = "ab";
char str2[] = "abc";
int ans = my_strcmp(str1, str2);
if (ans > 0)
printf(">\n");
else if (ans < 0)
printf("<\n");
else
printf("=\n");
return 0;
}
三、strcat和strncat的使用和模拟实现
1.strcat是一个连接两个字符长的函数,strcat(str1,str2)是将str2连接到str1的后面,并在这个连接后的字符串后面加上一个'\0',下面是strcat使用的一些前提。
模拟实现strcat:
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
char* my_strcat(char* dest, char* src)
{
char* ret = dest;
while (*dest) //找str2的'\0'的位置
dest++;
while (*dest++ = *src++);
return ret;
}
int main()
{
char str1[] = "abcdef";
char str2[20] = "12345";
char * p = my_strcat(str2, str1);
printf("%s", str2);
return 0;
}
2. strncat和strcat的用法一样,但是追加的字符是可以控制的,和strcmp中的num一样,追加str2前num个字符,但是最后也要加一个'\0'.
模拟实现strncat:
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
char* my_strncat(char* str1, char* str2, size_t num)
{
char* ret = str1;
while (*str1)
str1++; //找到'\0'的位置
while (num)
{
*str1 = *str2;
str1++;
str2++;
num--;
}
*str1 = '\0'; //别忘记,str1是字符串,最后要加上'\0'
return ret;
}
int main()
{
char str1[20] = "abcdef";
char str2[] = "12345";
char* ret = my_strncat(str1, str2+2, 3);
printf("%s\n", ret);
return 0;
}
四、strcpy和strncpy的使用和模拟实现
1.strcpy是一个复制函数,strcpy(str1,str2)是将str2中的字符复制到str1中。
2.strcpy是一个用法和strncpy一样的复制函数,但是这个复制可以控制复制的字符个数,它会复制str2中前num个字符到str1中.
模拟实现strcpy:
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
char* my_strcpy(char* dest, char* src)
{
char* ret = dest;
while (*dest++ = *src++);
return ret;
}
int main()
{
char str[10] = "abcdef";
char src[10] = "1234";
char *p = my_strcpy(str, src);
printf("%s", str);
return 0;
}
模拟实现strncpy:
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
char* my_strncpy(char* str1, const char* str2, size_t num)
{
char* ret = str1;
while (num)
{
*str1 = *str2;
str1++;
str2++;
num--;
}
return ret;
}
int main()
{
char str1[20] = "abcdef";
char str2[20] = "1234";
char* ret = my_strncpy(str1, str2, 3);
printf("%s\n", ret);
return 0;
}