字符串函数仿写

网友代码:

#include <stdio.h>
#include<string.h>
int my_strlen(const char* str)//寻找结束符号  找到返回索引
{
	int i;
	for (i = 0;; i++)
		if (str[i] == '\0') break;

	return i;
}

char* my_strcat(char* destination, const char* source, int buffer)
{
	int des_len = my_strlen(destination);
	int source_len = my_strlen(source);

	if (buffer <= des_len + source_len + 1) {
		if (buffer <= des_len + 1) {
			return destination;
		}
		else {//不够存放两个参数的空间 但可以存放第二个参数的部分字符
			int i, j;
			for (i = des_len, j = 0; i < buffer - 1; i++, j++)
			{
				destination[i] = source[j];
			}
			destination[i] = '\0';
		}
	}
	else {//足够存放a和b
		int i, j;
		for (i = des_len, j = 0; i < des_len + source_len; i++, j++)//这里用i做判断
			//实际条件是第二个参数的长度 我这里是直接用j做判断
		{
			destination[i] = source[j];
		}
		destination[i] = '\0';
	}

	return destination;
}
void testMyStrCat()
{
	char a[50] = "hello ";
	char b[] = "what is your name?";
	printf("length a:%d\n", my_strlen(a));
	printf("length b:%d\n", my_strlen(b));
	printf("sizeof(a):%d\n ", sizeof(a));
	my_strcat(a, b, sizeof(a));
	printf("连接后的字符串:%s%d", a, my_strlen(a));
}
int main()
{
	testMyStrCat();
}

这位大佬考虑了空间充足,不足以及部分充足的情况 我也是研究学习了一下
不足直接返回参数1的字符串就ok 充足的话进行拼接 如果空间不足以拼接参数1和2 但是却>参数1的字符数 就可以通过空间-1的数量把参数2的字符拼接过来 可以说是考虑的十分周全。
下面是我写的代码:

#include <stdio.h>
#include <string.h>
int main()
{
	//手写一个strcat函数
	char sou[20] = "hello";
	char des[] = "world";

	int i = 0;
	while (sou[i]!='\0')
	{
		i++;
	}
	for (size_t j = 0; j < strlen(des); j++)
	{
		sou[i] = des[j];
		i++;
	}
	printf("%s", sou);
}

说一下不足自省
1.如果我的参数2太大的话 程序直接b掉 没什么好说的!!

image.png

2.当然部分拷贝我觉得既然用到strcat就肯定是要把两个字符串完全拼接在一起 但是这种严谨的思路还是很值得我们这种菜鸟学习的。
我也是照着大佬的源码修改了一下

#include <stdio.h>
#include <string.h>
int main()
{
	//手写一个strcat函数
	char sou[10] = "hello";
	char des[] = "my name is cvpotato666666666666666666666666666666666666666666666666666666";

	int i = 0;
	int j = 0;
	if (sizeof(sou) < strlen(sou) + strlen(des) + 1)
	{
		
		if (strlen(sou) < sizeof(sou))
		{
			for (i = strlen(sou); i < sizeof(sou) - 1; i++)
			{
				sou[i] = des[j];
				j++;
			} 
			printf("%s\n", sou);
		}
		else
		{
			printf("%s\n", sou);
			return 0;
		}

	}
	else
	{
		for (size_t j = 0; j < strlen(des); j++)
		{
			sou[i] = des[j];
			i++;
		}
		printf("%s", sou);
	}
}

strlen函数

返回一个整型(字符串的长度 不包括\0)

#include <stdio.h>
int my_strlen(char* str)
{
	int i = 0;
	while (str[i] != '\0')
	{
		i++;
	}
	return i;
}
int main()
{ 
	char str1[20] = "hello";
	printf("%d\n", my_strlen(str1));
}

strcpy函数

仿写了strcpy函数 与系统函数不一样的是 本函数对于缓存区不够的情况下 可以拷贝部分函数(其实是鸡肋 本来strcpy就是要全部拷贝) 但也算是仿写了strcpy_s 一个较为安全的
以下是我的代码

#include<stdio.h>
#include<string.h>
#pragma warning (disable:4996)
char* my_strcpy(char* des, char* sou,int mem)
{
	int cpynumberd = strlen(des);
	int cpynumbers = strlen(sou);
	printf("mem = %d\n", mem);
	int i = 0;
	if (mem> cpynumbers+1)
	{
		for (i; i < cpynumbers; i++)
		{
			des[i] = sou[i];
		
		}
		des[i] = "\0";
		return des;
	}
	else if (mem<= cpynumbers+1)
	{
		for (i = 0; i < mem-1; i++)
		{
			des[i] = sou[i];
		
		}
		des[i] = '\0';
		return des;
	}
}
int main()
{
	char str1[5] = "hell";
	printf("sizeof str1 = %d\n", sizeof(str1));
	char str2[] = "fuck";
	printf("my_strcpy = %s\n",my_strcpy(str1, str2,sizeof(str1)));
	printf("   strcpy = %s\n", strcpy(str1, str2));
	strcpy_s(str1, sizeof(str1), str2);
	printf(" strcpy_s = %s\n", str1);
}

网友代码:

#include <stdio.h>
#include <string.h>
 
char *mystrcpy(char* dest,const char* src)
{   
    size_t i = 0;
    
    while (src[i] != '\0') {
      dest[i] = src[i];
      i++;
    }
    
    dest[i]='\0';
    
    return dest;
}
 
int main()
{
    char name[21];
    memset(name,0,sizeof(0));
    mystrcpy(name,"xiaoqiu");
 
    printf("strlen=%d\n",strlen(name)); // 7
    printf("sizeof=%d\n",sizeof(name)); // 21
 
    return 0;
}

通过i(参数2字符串的长度赋值给字符串1) 前提是字符串1的空间必须足够存放字符串2 否则会崩溃

strncpy函数

根据需要拷贝参数2字符串的固定字符
如果固定字符数量>参数1的空间则会崩溃

image.png

如果固定字符数量>参数2的字符串大小 则函数会把参数2的字符串拷贝到参数1的字符串并且多余的地用\0补齐

image.png

代码如下:

#include<stdio.h>
#include<string.h>
#pragma warning (disable:4996)
int my_strlen(char*str)
{
	int i = 0;
	while (str[i]!='\0')
	{
		i++;

	}
	return i;
}

char* my_strncpy(char*des,char*sou,int n)
{
	int len_sou = my_strlen(sou);
	int memdes = sizeof(des);
	if (n<=len_sou)//要拷贝的字符小于源字符串
	{
			for (size_t i = 0; i < n; i++)
			{
				des[i] = sou[i];

			}
			return des;

	}
	else if (n > len_sou)//要拷贝的字符数量大于源字符串
	{
			for (size_t i = 0; i < n+1; i++)
			{
				des[i] = sou[i];
				if (i== len_sou)
				{
					for (size_t j = i; j < n; j++)
					{
						des[j] = '\0';
					}
					break;
				}
			}
			return des;
	}

}
int main()
{
	char str[50] = "hello424244242424422";
	char str2[] = "fuck";
	my_strncpy(str, str2, 20);
	//strncpy(str, str2, 20);
	printf("%s\n", str);
}

strcmp仿写

函数是通过比较字符串的每个对应的字符(根据ascll表)

7c31a88996e5456ab80234ea6f194346.jpg

image.png

代码如下:

#include<stdio.h>
#include<string.h>
#include<stdio.h>
int my_strcmp1(char*str,char*str1)
{
	int i = 0;
	for (i; str[i] != 0 && str1[i] != 0; )
	{
		if (str[i] == str1[i])
		{
			i++;
			contine;
		}
		 if (str[i] > str1[i])
		{
			return str[i] - str1[i];
		}
		else
		{
			return str[i] - str1[i];
		}

	}
	return str[i]- str1[i];
}
int main()
{
	char str[20] = "hello";
	printf("str[16] = %c\n", str[16]);
	char str1[] = "hello";
	int  ret = my_strcmp1(str, str1);
	printf("%d\n", ret);
	if (ret>0)
	{
		printf("参数1>参数2");
	}
	else if(ret < 0)
	{
		printf("参数1<参数2");
	}
	else
	{
		printf("参数1==参数2");
	}
}

网友代码学习:

int mystrcmp(const char *p,const char *q){  
    while(*p==*q && *p != '\0'){  
        p++;  
        q++;  
    }  
    return *q-*p;  
}

strchr函数

表示在字符串 s 中查找字符 c,返回字符 c 第一次在字符串 s 中出现的位置,如果未找到字符 c,则返回 NULL。
本来我是用数组写的 想着没写到指针 能不用就尽量不用指针

char* my_strchri(char* str, int c)
{
	int i = 0;
	while (str[i]!=0)
	{
		if (str[i]==c)
		{
			break;
		}
		i++;
	}
	int length = strlen(str);
	int cout = i;
	int j = 0;
	char ret[5] = { 0 };
	for (j; j < length- cout; j++)
	{
		ret[j] = str[i];
		i++;
	}
	ret[j] = '\0';
	return &ret;
}

也可以实现strchr的效果,但是在计算字符处于第几个字符时,就会出现错误

image.png

两个字符长度相减+1就是字符的位置 很明显上面两个值不太对 但是取回来的字符串是对的 不知道什么情况
以下是我用指针写的代码:

char* my_strchr(char* str, int c)
{
	while (*str != NULL)
	{
		if (*str == c)
		{
			return str;
		}
		else
		{
			str++;
		}

		//寻找字符位置
	}
	return NULL;
}

image.png

网站标题:CV鼻祖洋芋

原创文章,作者:locus,如若转载,请注明出处:https://blog.cvpotato.cn/forward-code/c-2/74/

本博客所发布的内容,部分为原创文章,转载注明来源,网络转载文章如有侵权请联系站长!

(0)
上一篇 2024年11月14日 上午9:25
下一篇 2024年11月14日 上午11:04

相关推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注