常见库函数 strcpy,strlen,strcmp,strstr ,strcat的用法及模拟实现

常见库函数

1.strcpy字符串复制函数
头文件:
#include<string.h>
函数原型
char * strcpy(char * strDest,const char * strSrc);
该函数功能是将后面字符串的内容复制给前面的字符串。源字符串 即后面的字符串保持不变,前面的字符串被改变。
使用需注意:

  • 源字符串必须以 ‘\0’ 结束。
  • 会将源字符串中的 ‘\0’ 拷贝到目标空间。
  • 目标空间必须足够大,以确保能存放源字符串。
  • 目标空间必须可变。

看下面的代码:

#include<stdio.h>
#include<string.h>
int main()
{
	char  str1[]="hello";
	char str2[]="hello world";
	strcpy(str1,str2);
	printf("%s\n",str1);
	printf("%s\n",str2);
	return 0;
}

结果:
在这里插入图片描述
2.strlen 计算字符串长度函数
strlen所作的仅仅是一个计数器的工作,它从内存的某个位置(可以是字符串开头,中间某个位置,甚至是某个不确定的内存区域)开始扫描,直到碰到第一个字符串结束符’\0’为止,然后返回计数器值(长度不包含’\0’)。
注意:这里应注意用strlen 和sizeof计算字符串的长度或大小时的不同,strlen计算字符串长度是不包含‘\0’,而sizeof包含。
函数原型
*unsigned int strlen(char s);
例:

int main()
{
	char  str1[]="hello";
	int n=strlen(str1);
	int m=sizeof(str1);
	printf("strlen:%d\n",n);
	printf("sizeof:%d\n",m); 
	return 0;
}

在这里插入图片描述
3.strcmp字符串比较函数
C 库函数 **int strcmp(const char str1, const char str2)
把 str1 所指向的字符串和 str2 所指向的字符串进行比较。
**返回值:**若前字符串大于后面则返回一个正数,若小于则返回负数,若相等则返回0;
比较的方法:
将两个字符串从下标0开始比较,用相同下标的字符的ASCII进行逐个比较,知道比出大小不同的字符,当前字符那个大,那么那个字符串就大。
在这里插入图片描述
例:
在这里插入图片描述

4.strstr子串查找函数
strstr(str1,str2) 函数用于判断字符串str2是否是str1的子串。如果是,则该函数返回 str1字符串从 str2第一次出现的位置开始到 str1结尾的字符串;否则,返回NULL。
函数原型:string strstr( string1,string2)
举例:

 #include<string.h>
 #include<stdio.h>
 main()
 {
  char *string 1 = “needle in haystack";
  char *string2 = “hay"
  printf(“%s\n.”strstr(stringl,string2);
  }
输出:
haystac

5.strcat字符串连接函数
**char *strcat(char *dest, const char *src) **
把 src 所指向的字符串追加到 dest 所指向的字符串的结尾。
返回值:该函数返回一个指向最终的目标字符串 dest 的指针。

#include<stdio.h>
#include<string.h>
int main()
{
	char desc[50]="abc";
	char src[50]="def";
	strcat(desc,src);
	printf("%s",desc);
	return 0;
 } 

结果:
在这里插入图片描述

模拟实现

1.strcpy的模拟实现

char* my_strcpy(char* desc,const char* src) 
{
	char* ret=desc;			//保存目的字符串的地址
	assert(desc!=NULL);		//目的字符串不能为空
	assert(src!=NULL); 		//源字符串不能为空
	while(*desc++ = *src++)
	{
		;
	}
	return ret;
}

2.strlen的模拟实现
三种方式::
方法1:
计数器方式

unsigned int my_strlen(const char* desc)
{
	assert(desc!=NULL);
	int i=0;
	while(*desc)
	{
		i++;
		desc++;
	}
	return i;
}

方法2:
不创建临时变量

unsigned int my_strlen(const char* desc)
{
	assert(desc!=NULL);
	if(*desc=='\0')
		return 0;
	else
		return 1+my_strlen(desc+1);
}

方法3:
指针-指针的方式

unsigned int my_strlen(const char* desc)
{
	assert(desc!=NULL);
	char* p=desc;
	while(*p!='\0')
		p++;
	
	return p-desc; 
 } 

3.strcmp模拟实现

//减法运算判断
int my_strcmp(const char* str1,const char* str2)
{
	int ret=0;
	while(! (ret = *(unsigned char *)str1 - *(unsigned char *)str2) && *str2)
	{
		++str1;
		++str2;
	}
	
	if(ret<0)
		return -1;
	else if(ret>0)
		return 1;
	else
		return ret;
}

//比较判断运算
//比较运算判断
int MyStrcmp2(const char* dest, const char* src)
{
	assert(NULL != dest && NULL != src);

	while ((*dest) && (*src == *dest))
	{
		*dest++;
		*src++;
	}

	if (*(unsigned char*)dest > *(unsigned char*)src)
		return 1;
	else if (*(unsigned char*)dest < *(unsigned char*)src)
		return -1;
    else
		return 0;
}

**4.strstr**模拟实现

char* my_strstr(const char* str1,const char* str2 )
{
assert(str1!=NULL);
assert(sre2!=NULL);

char* cp=(char*) str1;

char* s1=NULL;
if(str2=='\0')
	return NULL;
	
while(*cp)
{
	char* substr=(char*) str2;
	if(*cp==*substr)
	{
		s1=cp;
		while(*s1&&*substr&&(*s1==*substr))
		{
			s1++;
			substr++;
		}
		if(*substr=='\0')
			return cp;
	}
	cp++;
}

}

**5.strcat**模拟实现

char* my_strcat(char* desc,const char* src)
{
assert(desc);
assert(src);
char* ret=desc;
while(*desc)
{
desc++;
}

while((*desc++=*src++))	
{
	;
}
return ret;

}


发布了70 篇原创文章 · 获赞 12 · 访问量 9801

猜你喜欢

转载自blog.csdn.net/lovehang99/article/details/100529524
今日推荐