• C语言模拟实现所有字符函数


    模拟 strlen 计算字符串个数

    strlen 函数的参数

    size_t strlen ( const char * str );
    
    • 1
    • strlen 是计算字符个数
    • strlen 是计算 ‘\0’ 之前的字符的长度

    代码实现:
    方法一
    以计数的方式计算

    int my_strlen(char* str)
    {
    	int count = 0;
    	while (*str)
    	{
    		str++;
    		count++;
    	}
    	return count;
    }
    int main()
    {
    	char arr[] = { "abcdef" };
    	int ret = my_strlen(arr);
    	printf("%d\n", ret);
    	return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17

    方法二
    不能创建临时变量
    以函数递归的方式计算

    int my_strlen(char* str)
    {
    	if (*str == 0)
    		return 0;
    	else
    		return 1 + my_strlen(str+1);
    }
    int main()
    {
    	char arr[] = { "abcdef" };
    	int ret = my_strlen(arr);
    	printf("%d\n", ret);
    	return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    方法三
    以指针 - 指针的方式计算

    int my_strlen(char* str)
    {
    	char* q = str;
    	while (*q)
    	{
    		q++;
    	}
    	return q - str;
    }
    int main()
    {
    	char arr[] = { "abcdef" };
    	int ret = my_strlen(arr);
    	printf("%d\n", ret);
    	return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    模拟 strcpy 字符串拷贝

    strcpy 函数的参数

    char* strcpy(char * destination, const char * source );
    
    • 1
    • strcpy 是字符串拷贝函数
    • strcpy 里的第一个参数是拷贝的目标空间,第二个参数是拷贝的内容
    • 注意
      1.拷贝的目标空间必须足够大,拷贝后能够存放字符串
      2 参数的顺序
      3

    代码实现:

    #include<assert.h>
    char* my_strcpy(char* arr, const char* str)
    {
    	char* s = str;
    	assert(arr);
    	assert(str);
    	while (*arr++ = *str++)
    	{
    		;
    	}
    	return s;
    }
    int main()
    {
    	char arr[] = { "#####################" };
    	char str[] = { "hello china!" };
    	printf("%s\n", my_strcpy(arr, str));
    
    	return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20

    模拟 strcat 字符串追加

    函数的参数

    char * strcat ( char * destination, const char * source );
    
    • 1
    • strcat 函数会在字符串最后位 ‘\0’ 的位置添加字符串

    代码实现:

    char* my_strcat(char* arr, char* str)
    {
    	char* s = arr;
    	assert(arr && str);
    	while (*arr)
    	{
    		arr++;
    	}
    	while (*arr++ = *str++)
    	{
    		;
    	}
    	return s;
    
    }
    int main()
    {
    	char arr[15] = { "hello " };
    	char str[] = { "china!" };
    	my_strcat(arr, str);
    	printf("%s\n", arr);
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22

    模拟 strcmp 字符串比较

    strcmp 函数的参数

    int strcmp ( const char * str1, const char * str2 );
    
    • 1
    • strcmp 是一个一个字符比较
      相等返回0
      第一个字符串大于第二个字符串,返回大于0的数字
      第一个字符串小于第二个字符串,则返回小于0的数字

    代码实现:

    int my_strcmp(const char* arr, const char* str)
    {
    	assert(arr && str);
    	while (*arr == *str && *str)
    	{
    		if (*arr == '\0')
    		{
    			return 0;
    		}
    		arr++;
    		str++;
    	}
    	
    	return *arr - *str;
    }
    int main()
    {
    	char arr[] = { "abcde" };
    	char str[] = { "abd" };
    	int ret = my_strcmp(arr, str);
    	if (ret > 0)
    		printf("arr > str");
    	else if (ret < 0)
    		printf("arr < str");
    	else
    		printf("arr == str");
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27

    模拟 strncpy 长度限制字符串拷贝

    strncpy 函数的参数

    char * strncpy ( char * destination, const char * source, size_t num );
    
    • 1
    • strncpy 可能只会拷贝字符串的某一段,也就有可能不拷贝 ‘\0’ ,所以在实现的时候必须要注意

    代码实现:

    char* my_strncpy(char* arr, const char* str, size_t num)
    {
    	assert(arr && str);
    	char* s = str;
    	while (num--)
    	{
    		*arr++ = *str++;
    	}
    	*arr++ = '\0';
    	return s;
    }
    int main()
    {
    	char arr[] = { "#####################" };
    	char str[] = { "hello china!####" };
    	my_strncpy(arr, str, 5);
    	printf("%s\n",arr);
    
    	return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20

    模拟 strncat 字符串追加

    strncat 函数参数

    char * strncat ( char * destination, const char * source, size_t num );
    
    • 1

    代码实现:

    char* my_strncat(char* arr, char* str, size_t num)
    {
    	assert(arr && str);
    	char* s = arr;
    	while (*arr++)
    	{
    		;
    	}
    	//寻找到 *arr 为 '\0' 又进行了一次 ++
    	//所以这里需要 -- 找到 '\0' 真正位置
    	arr--;
    	while (num--)
    	{
    		*arr++ = *str++;
    	}
    	*arr++ = '\0';
    	return s;
    }
    int main()
    {
    	char arr[20] = { "hello " };
    	char str[] = { "china! For a dettet tomorrow!" };
    	my_strncat(arr, str, 6);
    	printf("%s\n", arr);
    	return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26

    模拟 strncmp 字符串比较

    strncmp 函数参数

    int strncmp ( const char * str1, const char * str2, size_t num );
    
    • 1
    • 实现的方式和strcmp 都是一样的,只是加多了一个参数

    代码实现:

    int my_strncmp(char* arr, char* str, size_t num)
    {
    	while (num-- && (*arr - *str == 0) && *str)
    	{
    		arr++;
    		str++;
    	}
    	if (*arr > *str)
    		return 1;
    	else if (*arr < *str)
    		return -1;
    	else
    		return 0;
    }
    int main()
    {
    	char arr[10] = { "abcde" };
    	char str[10] = { "abyaa" };
    	int ret = my_strncmp(arr, str, 3);
    	if (ret > 0)
    		printf("arr > str");
    	else if (ret < 0)
    		printf("arr < str");
    	else
    		printf("arr == str");
    	return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27

    模拟 strstr

    strstr 函数参数

    char * strstr ( const char *str1, const char * str2);
    
    • 1
    • 作用:在A 字符串中查找是否包含 B字符串
      如果 A 中包含 B ,则返回 B 在 A 中首次出现的的地址。
      否则返回空指针!
    • 如果找到,返回的是字符串的地址,所以要用指针变量来接收

    代码实现:

    char* my_strstr(const char* arr, const char* str)
    {
    	char* xp = arr;
    	char* s1 = 0;
    	char* s2 = 0;
    	while (*xp)//如果 *xp 为0了,证明 arr 中 不包含 str
    	{
    		s1 = xp;
    		s2 = str;
    		while (*s1 && *s2 && ( *s1 - *s2 == 0))//只有 *s1 *s2 且 *s1 *s2 相等时才进行查找
    		{
    			s1++;
    			s2++;
    		}
    		if (*s2 == '\0')
    			return xp;
    		xp++;//如果 s2 没有找完,那么 xp 进入下一个位置继续查找
    	}
    	return NULL;
    }
    int main()
    {
    	char arr[] = { "abcdefg" };
    	char str[] = { "cdb" };
    	
    	printf("%s\n", my_strstr(arr, str));
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
  • 相关阅读:
    LeetCode_位运算_中等_318.最大单词长度乘积
    如何保证电子产品可靠性设计?PCB板可制造性设计需要引起广大工程师的注意!
    数据逻辑校验机制
    MySQL笔记-06 基础SQL操作
    react 项目搭建步骤
    JAVA操作Json的ObjectMapper类
    Python学习日记-第三十八天-生成器
    2022西门子白帽黑客大赛丨工控安全赛事新起点 人才培养见真章
    elk日志收集系统
    黑马瑞吉外卖之移动端验证码登录使用qq邮箱
  • 原文地址:https://blog.csdn.net/m0_66483195/article/details/125463933