字符函数分析及模拟实现

字符函数分析及模拟实现

目录

strlen:返回字符串的长度

         strlen的模拟实现

strcpy:字符串的拷贝,            strncpy:长度受限制的字符串拷贝

         strcpy的模拟实现

strstr:字符串的查找

         strstr的模拟实现

strcmp:字符串的比较              strncmp:长度受限制的字符串比较

         strcmp的模拟实现

strcat:字符串的追加                strncat:长度受限制的字符串追加

         strcat的模拟实现


1.strlen

注意:strlen的返回值是size_t(无符号整形)

具体用法:(别忘记strlen的头文件<string.h>)

#include <stdio.h>
#include <string.h>

int main ()
{
  char arr[256];
  printf ("请输入一个字符串: ");
  gets (arr);
  printf ("这个字符串所占大小为:%d\n",(unsigned)strlen(arr));
  return 0;
} 

1.1strlen函数的模拟实现

#include<stdio.h>
#include<string.h>
size_t fig_str(char *arr)
{
	int count = 0;
	assert(arr != NULL);
	while (*arr++)
	{
		count++;
	}
	return count;
}

int main()
{
	char arr[100] = { "aabcdefwcng" };
	scanf("%s", arr);
	int num=fig_str(arr);
	printf("%d\n", num);
	return 0;
}

2.strcpy

注意:1.strcpy函数的返回值是一个字符类型指针

           2.源字符串(下图中的arr2)必须以‘\0’结束,不然printf输出时不会结束

           3.目标空间(下图中的arr1)必须足够大,能够容下源字符串

           4.目标空间必须可修改(不能修改的话,源字符串不能被拷贝了)

具体用法:

#include<stdio.h>
#include<string.h>
int main()
{
char arr1[10]={"abcdefg"};
char arr[10]={"abc"};
strcpy(arr1,arr2);
return 0
}

 2.1 strcpy函数的模拟实现

#include<stdio.h>
#include<string.h>
char* my_strcpy(char* arr1, char* arr2)
{
	while (*arr1++ = *arr2++);
	return arr1;
}


int main()
{
	char arr1[10] = { "0" };
	char arr2[5] = { "0" };
	gets(arr1);
	gets(arr2);
	my_strcpy(arr1, arr2);
	printf("%s\n", arr1);
	return 0;
}

 2.2strncpy函数的介绍

strncpy和函数strcpy几乎用法一样,strncpy函数是一个限制长度的,即传入一个整形表示需要拷贝的字符数量

具体用法:

#include<stdio.h>
#include<string.h>
int main()
{
char arr1[10]={"abcdefg"};
char arr2[10]={"abcd"};
char* ret=strncpy(arr1,arr2,3);
printf("%s",ret);
return 0;
}

 注意:

strncpy是不会帮你在目标字串后面加0的,

所以用完strncpy不手动在后面加零的话,就会出错,一定要注意。

加零的方法有2个,

一是拷贝前,用ZeroMemory()把整个缓冲区置0。

二是计算好字串的实际长度,手动加0。

3.strstr

 注意要点:strstr函数返回的是字字符号串首次出现的地址

具体用法:

#include<stdio.h>
#include<string.h>
int main()
{
char arr1[10]={"bbcdfe"};
char arr2[10]={"cdf"};
char* ret=strstr(arr1,arr2);
printf("%s",ret);
return 0;
}

2.1strstr函数的具体实现

#include<stdio.h>
#include<string.h>
char* my_strstr(char* arr1, char* arr2)
{
	assert(arr1 && arr2);
	char* s1 = arr1;
	char* s2 = arr2;
	while (*arr1&&*arr2)
	{
		
	while (*arr1++!= *arr2);
		s1 = arr1;
		while (*arr1 == *arr2)
		{
			arr1++;
			arr2++;
			if (*arr2 == '\0')
			{
				return s1;
			}
		}
		arr1 =s1 + 1;
	}
	return 0;
}


int main()
{
	char arr1[10] = { "0" };
	char arr2[10] = { "0" };
	gets(arr1);
	gets(arr2);
	char* ret=my_strstr(arr1, arr2);
	if (ret == NULL)
	{
		printf("找不到\n");
	}
	else
	{
		printf("%s\n", ret); 
	}
	return 0;
}

 4.strcmp

注意点:该函数的返回值为int型整型

              <0:说明str1小于str2;

              =0:说明两个字符串相等;

              >0:说明str1大于str2;

具体用法:

#include<stdio.h>
#include<string.h>
int main()
{
char arr1[10]={"abc"};
char arr2[10]={"ac"};
int ret=strcmp(arr1,arr2);
if(ret>0)
printf("arr1更大");
else if(ret=0)
printf("两个字符串相等");
else
printf("arr2更大");
return 0;
}

4.1strcmp的模拟实现

#include<stdio.h>
#include<string.h>
int my_strcmp(const char* arr1, const char* arr2)
{
	while ((*arr1==*arr2)!='\0')
	{
		arr1++;
		arr2++;
		//if ((*arr1 == *arr2)=='\0')
		if(*arr1==*arr2&&*arr1=='\0'&&*arr2=='\0')
		{
			return 0;
	    }
		
	}
	return *arr1 - *arr2;
}

int main()
{
	char arr1[10] = { "0" };
	char arr2[10] = { "0" };
	gets(arr1);
	gets(arr2);
	int ret=my_strcmp(arr1,arr2);
	if (ret > 0)
	{
		printf("arr1更大");
	}
	else if (ret ==0)
	{
		printf("一样大");
	}
	else if(ret<0)
		printf("arr2更大");
	return 0;
}

4.2strncmp函数的介绍

strncmp函数和strcmp用法一致,唯一的不同点是,strncmp是对前num个字符进行比较;

5.strcat

注意点:

 具体实现:

#include<stdio.h>
#include<string.h>
int main()
{
char arr1[10]={"abcd"};
char arr2[3]={"ac"};
char* ret=strcat(arr1,arr2);
printf("%s",ret);
return 0;
}

5.1strcat模拟实现

#include<stdio.h>
#include<string.h>
char* my_strcat(char* arr1, const char* arr2)
{
	while (*arr1)
	{
		arr1++;
	}
	while (*arr1 = *arr2)
	{
		arr1++;
		arr2++;
	}
	return arr1;
}


int main()
{
	char arr1[100] = { "0" };
	char arr2[100] = { "0" };
	gets(arr1);
	gets(arr2);
	my_strcat(arr1, arr2);
	printf("%s\n",arr1);
	return 0;
}

5.2strncat函数的介绍

strncat用法和strcat一致,唯一的不同就是strncat拷贝的是前num个字符.

 
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

年轻人江老Der

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值