C语言中一些库函数(字符串类型)的实现

目录

一. strcmp

二.strncmp

三.strcpy

四.strncpy

五.strncat--字符串追加

六.strstr--字符串查找

一. strcmp

初学这个函数的时候可能有误区,以为比较的是字符串长度,实则不然,strcmp比较的是字符的ascii码值,在vs编译器中,第一个字符大于第二个字符,就>0;小于第二个字符,就<0;
第一个字符等于第二个字符,就=0,相等就比较下一个字符,依此递推。

int strcmp( const char *string1, const char *string2 );

1.参数说明

string1和string2为两个要比较的字符串,返回一个int值。

2.代码实现

int my_strcmp(const char* str1, const char* str2)
{
    assert(str1&&str2);//断言,NULL指针直接失败
    while (*str1 == *str2)
    {
        if (*str1 == '\0')
        {
            return 0;
        }
        str1++;
        str2++;
    }
    /*if (*str1 > *str2)
        return 1;
    else
        return -1;*/
       //简化
    return (*str1 - *str2);
}
int main()
{
	const char* str1 = "abcdef";
	const char* str2 = "aqwer";
	//利用库函数int ret = strcmp(str1, str2);//实际比的不是长度,而是比的字符ascii码值
    int ret=my_strcmp(str1,str2);
	//a=s,那么往后比较
	printf("%d\n", ret);//linux -gcc操作系统中当是>0 返回>0;当时=0,返回0;当是<0,返回<0
	//判断要>,=,<0


	return 0;
}

二.strncmp

1.指定前n个字符进行比较,不受'\0'的限制,需要输入三个参数,

int strncmp( const char *string1, const char *string2, size_t count );

string1和string2两个要比较的字符串和要比较count个字符。

#include<stdio.h>
#include<string.h>​
#include<assert.h>
int my_strncmp(char* str1, char* str2, size_t count)
{
	assert(str1 && str2);//断言
	while (*str1 == *str2 && count)//简化语句
	{
		if (*str1 == '\0')
		{
			return 0;
		}
		str1++;
		str2++;
		count--;
	}
	if (count == 0)//此处说明已经前几个相同了。
	{
		return 0;
	}
	if (*str1 > *str2)
		return 1;
	else if (*str1 < *str2)
		return -1;
	else
		return 0;
}
int main()
{
	char str1[] = "abddd";
	char str2[] = "abd";
	int ret =my_strncmp(str1, str2, 4);
	printf("%d\n", ret);
	return 0;
}

三.strcpy

1.字符串拷贝

char *strcpy( char *strDestination, const char *strSource );

把一个字符串拷贝到另一个字符串,结束以'\0'为标识。需要注意的是目的地空间应该大于起始。

2.代码实现

char* my_strcpy(char* dest, const char* sry)
{
	assert(dest && sry);
	char* start = dest;//返回起始位置
	while (*sry != '\0')
	{
		*dest = *sry;
		dest++;
		sry++;
	}
	if (*sry == '\0')
		*dest = '\0';
	return start;
}
int main()
{
	char arr1[] = "bit";
	char arr2[] = "hello world";
	my_strcpy(arr2, arr1);
	printf("%s\n", arr2);
	return 0;
}

四.strncpy

1.拷贝num个字符从源字符串到目标空间,不过在笔者看来,这个库函数并不能让人满意,主要是因为看图::

 相信大家可以看到,我只想拷贝bitb到arr2,而这是因为库函数没有进行追加'\0'.笔者自我实现一个函数,(说不定是笔者浅薄,无法理解库函数深意),实现只要num个字符拷贝。

2.代码实现

#include<stdio.h>
#include<assert.h>
char* my_strncpy(char* dest, const char* sry, int count)
{
	assert(dest && sry);
	char* start = dest;
	while (count&&(*dest++=*sry++))//凝炼成这么一个短句真是精妙
	{
		count--;
	}
	if (count!='\0')
	{
		while (--count)//因为是先执行上个while条件句再判断,故count在上个while语句未减1,而执行了*dest++=*sry++,所以应该前置--
		{
			*dest++ = '\0';
		}
	}
                else
                      *dest='\0';//加上这么一句话就可以弥补库函数的瑕疵
	return start;
}
int main()
{
	char arr1[] = "bit";
	char arr2[] = "abcedfg";
	my_strncpy(arr2, arr1, 5);//需要注意目的地数组的空间应该大于等于要拷贝的长度
	printf("%s\n", arr2);
	return 0;
}

五.strncat--字符串追加

1.在dest末尾追加num个字符,注意目的地空间要够大,追加最后在后面补个'\0'.

char *strncat( char *strDest, const char *strSource, size_t count );

2.代码实现

#include<stdio.h>
#include<assert.h>
char* my_strncat(char* dest, const char* sry, int count)
{
	assert(dest && sry);
	char* start = dest;
	while (*dest != '\0')
	{
		dest++;
	}//直接到代码末尾
	while (count&&(*dest++=*sry++))
	{
		count--;
	}
	if (count)//说明sry已经到'\0'
	{
		while (--count != 0)\\这个前置--挺好玩
		{
			*dest++ = '\0';
		}
	}
	else
		*++dest = '\0';
	return start;
}
int main()
{
	char arr1[30] = "hello";
	char arr2[] = "world";//时候会在后面补个'\0',如果追加的个数长于源字符串,那么就打印源字符串
	my_strncat(arr1, arr2, 2);//追加的
	printf("%s\n", arr1);
	return 0;
}

六.strstr--字符串查找

1.函数

1、strstr() 函数搜索一个字符串在另一个字符串中的第一次出现。
2、找到所搜索的字符串,则该函数返回第一次匹配的字符串的地址;
3、如果未找到所搜索的字符串,则返回NULL。

​
char *strstr(const char *dest, const char *sry);

​

 dest: 被查找目标
  sry: 要查找对象.

2.函数实现

char* my_strstr(const char* dest, const char* sry)
{
	assert(dest && sry);
	const char* dest1 = dest;
	const char* sry1= sry;
	const char* tmp = dest;//设两个dest的替换,一个用于判断,一个用于跳出循环
	while (*tmp)
	{
		dest1 = tmp;
		sry1 = sry;//如果不等,那么再次循环时dest1要往后查找,所以要赋tmp,而sry1则还是在首地址
		while (*dest1 && *sry1 && (*dest1 == *sry1))
		{
			*dest1++;
			*sry1++;
		}
		if (*sry1 == '\0')
		{
			return (char*)tmp;//找到子串并返回要第一次匹配字符串的地址
		}
		if (*dest1 == '\0')//一直到查完dest都没找到
		{
			return NULL;
		}
		tmp++;
	}
}
int main()
{
	const char*str1="bbc";
    const char*str2="bcbbcdef";
	char* ret =my_strstr(str2,str1);
	if (ret == NULL)
	{
		printf("子串不存在\n");
	}
	else
		printf("找到子串:%s\n", ret);
	return 0;
}

以上是笔者初学C的一些字符串库函数实现的代码。有几个是笔者自己敲构造的,在编译过程中没有出现问题。如果有问题,劳烦各位大佬指教啊。🌹

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值