strlen(), strcpy(), strstr(), strcat(), strcmp(), memcpy()系列函数的实现

strlen()函数

功能:计算给定字符串的(unsigned int型)长度,不包括'\0'在内
 

实现:

int strlen(const char *str) {
	assert(str != NULL);

	int len = 0;
	while( (*str++) != '\0')
		len++;

	return len;
}

 

strcpy()函数

功能:字符串复制函数,strcpy把含有'\0'结束符的字符串复制到另一个地址空间,返回值的类型为char*。

实现:


char *strcpy(char *strDes, const char *strSrc) {
	if(strSrc == NULL || strDes == NULL)
		return NULL;

	char *address = strDes;

	while( (*strDest++ = *strSrc++) != '\0');

	return address;

}

 

strstr()函数

功能:strstr(str1,str2) 函数用于判断字符串str2是否是str1的子串。如果是,则该函数返回str2在str1中首次出现的地址;否则,返回NULL。

实现:

int strstr(char *string, char *substring) {
	if(string == NULL || substring == NULL)
		return -1;

	int lenstr = strlen(string);
	int lensub = strlen(substring);

	if(lenstr < lensub)
		return -1;

	int i,j;

	for(int i = 0; i < lenstr-lensub; ++i) {
		for(j = 0; j < lensub; ++j) {
			if(string[i+j] != substring[i])
				break;
		}

		if(j == lensub)
			return i;
	}

	return -1;

}

strcat()函数

功能:把src所指向的字符串(包括“\0”)复制到dest所指向的字符串后面(删除*dest原来末尾的“\0”)。要保证*dest足够长,以容纳被复制进来的*src。*src中原有的字符不变。返回指向dest的指针

实现:

char* strcat(char* strDest, const char* strSrc) {
	char* address = strDest;
	assert( (strDest != NULL) && (strSrc != NULL) );

	while(*strDest != '\0')	//当strDest='\0'时结束,即为字符串的结尾,将strSrc添加到此处
		strDest++;

	while(*strSrc != '\0')
		*strDest++ = *strSrc++;

	*strDest = '\0';

	return address;
}

strcmp()函数

功能:对两个字符串进行比较,若s1、s2字符串相等,则返回零;若s1大于s2,则返回正数;否则,则返回负数。

实现:

int strcmp(const char* str1, const char* str2) {
	assert( (str1 != NULL) && (str2 != NULL) );
	int ret = 0;

	while( !(ret = *(unsigned char*)str1 - *(unsigned char*)str2) && *str1 ) {//ret=0,相等,相等时要确定两个字符不为'\0';  ret!=0时,循环结束,判断ret值
		str1++;
		str2++;
	}

	if(ret > 0)
		return 1;

	else if(ret < 0)
		return -1;

	return 0;
}

memcpy()函数

功能::将str指向地址为起始地址的连续n个字节的数据复制到以dest指向地址为起始地址的空间内,函数返回一个指向dest的指针.

实现:

void* memcpy(void *dest, const void *src, size_t n) {
	if(dest == NULL || src == NULL)
		return NULL;

	char* pdest = (char*)dest;
	char* psrc = (char*)src;

	while(n--)
		*pdest++ = *psrc++;

	return dest;
}

猜你喜欢

转载自blog.csdn.net/amoscykl/article/details/86091269
今日推荐