C语言:模拟实现字符串函数strlen,strcpy,strcat,strcmp,strchr,strstr

什么是C语言中的字符串

字符串或串(String)是由数字、字母、下划线组成的一串字符。通常放在常量字符串中或者字符数组中。C语言中以 ‘\0’ 来作为字符串的结束标记。

字符的ASCII编码表
C语言:模拟实现字符串函数strlen,strcpy,strcat,strcmp,strchr,strstr_第1张图片

1.strlen

功能:字符串求长
计算给定字符串的(unsigned int型)长度,不包括 ‘\0’ 在内,参数指向的的字符串必须以 ‘\0’ 结束,返回值为 size_t 无符号的。

用法:
size_t strlen ( const char * str )

头文件:string.h

模拟实现:

//非递归
int my_strlen1(const char *str)
{
	int count = 0;
	while(*str != '\0')
	{
		count++;
		str++;
	}
	return count;
}

//递归
int my_strlen2(const char *str)
{
	if (*str == '\0')
	{
		return 0;
	}
	else
		return 1 + my_strlen2(str + 1);
}

运行结果:

	char str[100] = {0};
	printf("请输入字符串:");
	scanf("%s",&str);
	printf("字符串长度为:%d\n",my_strlen1(str));
	printf("字符串长度为:%d\n",my_strlen2(str));

C语言:模拟实现字符串函数strlen,strcpy,strcat,strcmp,strchr,strstr_第2张图片

2.strcpy

功能:字符串串复制
把源字符串复制到目标空间。源字符串必须以 ‘\0’ 结束,目标空间必须可变,src 和 dest 所指内存区域不可以重叠且 dest 必须有足够的空间来容纳 src 的字符串。

用法:
char * strcpy ( char * destination, const char * source )

头文件:string.h

模拟实现:

char *my_strcpy(char *dest, const char *src)
{
	char *ret = dest;
	assert(dest != NULL);
	assert(src != NULL);
	while((*dest++ = *src++))
	{
		;
	}
	return ret;
}

运行结果:

	char str1[] = "i im a boy";
	char str2[100] = {0};
	printf("src:%s\n",str1);
	printf("dest:%s\n",my_strcpy(str2, str1));

在这里插入图片描述

3.strcat

功能:字符串连接
把两个字符串连接起来。源字符串必须以 ‘\0’ 结束,目标空间必须可变。把 src 所指字符串添加到 dest 结尾处(覆盖 dest 结尾处的 ‘\0’ ), dest 必须有足够的空间来容纳 src 的字符串

用法:
char * strcat ( char * destination, const char * source )

头文件:string.h

模拟实现:


char *my_strcat(char *dest, const char *src)
{
	char *ret = dest;
	assert(dest != NULL);
	assert(src != NULL);
	while(*dest != '\0')
	{
		dest++;
	}
	while((*dest++ = *src++))
	{
		;
	}
	return ret;
}

运行结果:

	char str1[100] = "i im";
	char str2[] = " a boy";
	printf("%s\n",my_strcat(str1, str2));

C语言:模拟实现字符串函数strlen,strcpy,strcat,strcmp,strchr,strstr_第3张图片

4.strcmp

功能:字符串比较
设这两个字符串为str1,str2,
看ASCII码
若str1=str2,则返回零;
若str1 若str1>str2,则返回正数。

用法:
int strcmp ( const char * str1, const char * str2 )

头文件:string.h

模拟实现:

int my_strcmp(const char *str1, const char *str2)
{
	int ret = 0;		
	assert(*str1 != NULL);
    assert(*str2 != NULL);
	while( ! (ret = *(unsigned char *)str1 - *(unsigned char *)str2) && *str2)
	{
		str1++;
		str2++;
	}
	if (ret < 0)
		ret = -1;
	else if (ret > 0)
		ret = 1;
	return (ret);
}

运行结果:

	char *str1 = "abcde";
	char *str2 = "abcde";
	char *str3 = "abcef";
	printf("%d\n",my_strcmp(str1, str2));
	printf("%d\n",my_strcmp(str1, str3));
	printf("%d\n",my_strcmp(str3, str2));

C语言:模拟实现字符串函数strlen,strcpy,strcat,strcmp,strchr,strstr_第4张图片

5.strchr

功能:查找字符串str中首次出现字符c的位置
返回首次出现c的位置的指针,返回的地址是被查找字符串指针开始的第一个与Val相同字符的指针,如果str中不存在c则返回NULL。

用法:

const char * strchr ( const char * str, int character )
      char * strchr (       char * str, int character )

头文件:string.h

模拟实现:

char *my_strchr(char *str, char c)
{
 
	assert(str != NULL);
	while(*str != '\0' && *str != c)
	{
		++str;
	}	
	return *str == c ?str:NULL;
}

运行结果:

	 char *str = "abcdef";
	 printf("%s\n",my_strchr(str, 'c'));

C语言:模拟实现字符串函数strlen,strcpy,strcat,strcmp,strchr,strstr_第5张图片

6.strstr

功能:在字符串中查找
str1: 被查找目标 string expression to search
str2: 要查找对象 The string expression to find
返回值:若str2是str1的子串,则返回str2在str1的首次出现的地址;如果str2不是str1的子串,则返回NULL。

用法:

const char * strstr ( const char * str1, const char * str2 );
      char * strstr (       char * str1, const char * str2 )

头文件:string.h

模拟实现:

char *my_strstr(const char *dest, const char *src)
{
    assert(dest);
	while (*dest)
	{
		while ((*dest != *src) && (*dest != 0))
			dest++;
		while (*dest == *src)
		{
			const char*pdest = dest;
			const char*psrc = src;
			while(*pdest == *psrc) 
			{
				pdest++;
				psrc++;
			}
			if (*psrc == 0)
				return (char*)dest;
			else 
				dest++;
		}
	}
	    return NULL;
}

运行结果:

    char *str1 = "qwertyuiop";
	char *str2 = "yui";
	char *str3 = "ery";
	printf("%s\n", my_strstr(str1, str2));
	printf("%s\n", my_strstr(str1, str3));

C语言:模拟实现字符串函数strlen,strcpy,strcat,strcmp,strchr,strstr_第6张图片

你可能感兴趣的:(C语言:模拟实现字符串函数strlen,strcpy,strcat,strcmp,strchr,strstr)