strlen,strcmp,strcpy,strcat,strstr,strchr等字符串处理函数的内部实现

1.strlen();

函数介绍(得到字符串的长度):

int strlen(const char *s);

形参:字符串首地址

返回值:字符串长度

内部实现:

int strlen(const char *s) 
{
	int len = 0;
	while(*s++ != '\0')
	{
		len++;
	}
	return len;
}

2.strcmp();

函数介绍(比较两字符串的大小):

int strcmp(char *s1,char *s2);

形参:两段字符串的首地址

返回值:若s1>s2,返回一个正值;

                若s1==s2,返回0;

                 若s1<s2,返回一个负值;

内部实现:

int strcmp(char *s1,char *s2)
{
	int ret = 0;
    while (!(ret = *s1 - *s2) && *s2)
    {
        ++s1;
        ++s2;
    }
    if (ret < 0)
    {
        ret = -1;
    }
    else if (ret > 0)
    {
        ret = 1;
    }
    else
    {
        ret = 0;
    }
    return ret;
}

3.strncmp();

函数介绍(比较两个字符串前n个字符的大小):

int strncmp(const char *s1,const char *s2,int n)

 形参:前面两个形参是待比较的两个字符串首地址,第三个形参是想要前n个字符;

返回值:同strcmp()函数,只不过比较的是前n个字符而已;

内部实现:

int strncmp(const char *s1,const char *s2,int n)
{
	int ret = 0;
    while(n && !(ret = *s1 - *s2) && *s2)
    {
        ++s1;
        ++s2;
		--n;
    }
    if (ret < 0)
    {
        ret = -1;
    }
    else if (ret > 0)
    {
        ret = 1;
    }
    else
    {
        ret = 0;
    }
    return ret;
}

4.strcpy();

函数介绍(将一个字符串拷贝给另一个字符串):

char* strcpy(char *dest,const char *src)

 形参:两字符串的首地址,将src当中的内容拷贝给dest

返回值:拷贝完成后字符串的首地址

内部实现:

char* strcpy(char *dest,const char *src)
{
	if ( dest == NULL || src == NULL)
        return NULL;
    if ( dest == src)
        return dest;
	char *temp = dest;
    while(*src != '\0')
	{
		*dest = *src;
		dest++;
		src++;
	}
    return temp;
}

5.strncpy();

函数介绍(拷贝前n个字符):

char* strncpy(char *dest,const char* src,int n);

 形参:前两个同上一个函数,第三个参数是想要拷贝字符串的前n个字符

返回值:同上

内部实现:

char* strncpy(char *dest,const char* src,int n)
{
	if ( dest == NULL || src == NULL)
        return NULL;
    if ( dest == src)
        return dest;
	char *temp = dest;
    while(n &&*src != '\0')
	{
		*dest = *src;
		dest++;
		src++;
		n--;
	}
	*dest = '\0';
    return temp;
}

6.strcat();

函数介绍(将一段字符串连接到另一段字符串的后面):

char* strcat(char *dest,const char* src);

形参:两个字符串的首地址,将src字符串连接到dest后面;

返回值:返回连接后字符串的首地址

内部实现:

char* strcat(char *dest,const char* src)
{
	if ( dest == NULL || src == NULL)
        return NULL;
	char *temp = dest;
	while(*dest != '\0')
	    dest++;
	while(*src != '\0')
	{
		*dest = *src;
		src++;
		dest++;
	}
	
	return temp;
}

7.strncat();

函数介绍(将一段字符串前n个字符连接到另一个字符串上):

char* strncat(char *dest,const char* src,int n);

形参:同上,第三个形参是前n个字符

返回值:同上;

内部实现:

char* strncat(char *dest,const char* src,int n)
{
	if ( dest == NULL || src == NULL)
        return NULL;
	char *temp = dest;
	while(*dest != '\0')
	    dest++;
	while(n && *src != '\0')
	{
		*dest = *src;
		src++;
		dest++;
		n--;
	}
	*dest = '\0';
	return temp;
}

8.strstr();

函数介绍(在s1字符串中查找和s2相同的字符串):

const char *strstr(const char *s1, const char *s2);

形参:两个字符串的首地址

返回值:若查找到,返回s1中和s2中相同字符串的首地址

                若没找到,返回NULL

内部实现:

const char *strstr(const char *s1, const char *s2)
{
	const char *temp1;
	const char *temp2 = s2;
	while(*s1 != '\0')
	{ 
        temp1 = s1;
		while(*s1 == *s2)
		{
			s1++;
			s2++;
			if(*s2 == '\0')
				return temp1;
		}
		s1++;
		s2 = temp2;
	}
	return NULL;
}

9.strchr();

函数介绍(在字符串s1中查找和字符ch相同的字符):

const char* strchr(const char *s1,char ch);

形参:一段字符串和要查找的字符

返回值:若找到,返回s1中和ch相等的那个字符的指针

                若没找到返回NULL

内部实现:

const char* strchr(const char *s1,char ch)
{
	const char *temp;
	while(*s1 != '\0')
	{
		temp = s1;
		if(*s1 == ch)
			return temp;
		s1++;
	}
	return NULL;
}

测试程序:

int main()
{
    char p[] = "jjunku";
	char q[] = "jjunmingyue";
	char m[] = "min";
    // printf("%d\n",strlen(p));
    // printf("%d\n",strncmp(p,q,5));
	// printf("%d\n",strncmp(p,q,6));
	// printf("%s\n",strcpy(q,p));  
	// printf("%s\n",strncpy(q,p,2));
	// printf("%s\n",strcat(q,p));
	// printf("%s\n",strncat(q,p,2));
	printf("%s\n",strstr(q,m));
	printf("%s\n",strchr(p,'u'));
    return 0;
}

猜你喜欢

转载自blog.csdn.net/yue_jijun/article/details/81237241
今日推荐