【C语言】string.h头文件检验字符串函数仿写


所需头文件:stdio.h stdlib.h string.h

(1)strlen字符串求长度

int strlen_my(const char* src_str)
{
    
    
	
	if (NULL == src_str)
	{
    
    
		return -1;
	}
	const char* p = src_str;
	while (*p != '\0')
	{
    
    	
		p++;
	}
	return p - &(src_str[0]);
}
//递归
int strlen_my2(const char* src_str)
{
    
    
	if (src_str == NULL)
		return -1;
	if (*src_str)
	{
    
    
		return strlen_my2(src_str + 1) + 1;
	}
	else
	{
    
    
		return 0;
	}
}

int main()
{
    
    
	const char* p = "hello";
	printf("%d \n",strlen_my(p));
	return 0;
}

(2)strcmp / strncmp字符串比较

int strcmp_my(const char* str_a, const char* str_b)
{
    
    
	while ((*str_a != '\0' || *str_b != '\0') && *str_a == *str_b )
	{
    
    
		str_a++;
		str_b++;
	}

	return *str_a - *str_b > 0 ? 1 : (*str_a - * str_b < 0 ? -1 : 0);
}
int strcmp_my2(const char* str_a, const char* str_b)
{
    
    
	int sub = 0;
	while ((sub = *str_a - *str_b) == 0 && *str_a++ && *str_b++);	//先赋值,指针再++

	return sub > 0 ? 1 : (sub < 0 ? -1 : 0);
}

int strncmp_my(const char* str_a, const char* str_b, size_t front_len)
{
    
    
	while (--front_len && *str_a != '\0' && *str_b != '\0' 
		&& *str_a == *str_b)
	{
    
    
		str_a++;
		str_b++;
	}

	return *str_a - *str_b > 0 ? 1 : (*str_a - *str_b < 0 ? -1 : 0);
}

int main()
{
    
    
	const char* p = "hella";
	const char* q = "hell";
	printf("%d \n", strncmp_my(p, q, 4));
	return 0;
}

(3)strchr / strrchr 字符串中查找字符ch

  • 查找第一个出现的字符ch
//strchr 返回字符串中第一个出现的字符ch
char* strchr_my(const char* src_str, char ch)
{
    
    
	if (src_str == NULL)
	{
    
    
		return NULL;
	}

	while (*src_str != '\0' && *src_str != ch)
	{
    
    
		src_str++;
	}

	return *src_str == '\0' ? NULL : src_str;
}

int main()
{
    
    
	const char* p = "hello";
	p = strchr_my(p, 'e');
	if (p == NULL)
		return 0;
	printf("%c\n", *p);
}

  • 查找最后一个出现的字符ch
//strrchr查找字符串中最后一个出现的字母ch
char* strrchr_my(const char* src_str, char ch)
{
    
    
	if (NULL == src_str) return NULL;
	const char* p = src_str + strlen(src_str) - 1;

	while ((p - src_str) >= 0 && *p != ch)
	{
    
    
		p--;
	}
	if (p - src_str == -1)
	{
    
    
		return NULL;
	}
	return p;
}

int main()
{
    
    
	const char* p = "hello";
	//p = strchr_my(p, 'q');

	p = strrchr_my(p, 'l');
	if (p == NULL)
		return 0;
	printf("%c\n", *p);
}

(4)strstr 字符串匹配:src_str中查找des_str,返回匹配的起始位置,没有为NULL(BF算法)

char* strstr_my(const char* src_str, const char* des_str)
{
    
    
	if (NULL == src_str || NULL == des_str)
	{
    
    
		return NULL;
	}

	int len_src = strlen(src_str);
	int len_des = strlen(des_str);
	int i = 0;	//src_str
	int j = 0;	//des_str

	while (i < len_src && j < len_des)
	{
    
    
		if (src_str[i] == des_str[j])
		{
    
    
			i++;
			j++;
		}
		else
		{
    
    
			i = i - j + 1;
			j = 0;
		}
	}

	if (j == len_des)
	{
    
    
		return src_str + i - j;
	}
	return NULL;
}

int main()
{
    
    
	const char* p = "hello";
	const char* q = "llo";
	const char* rt = strstr_my(p, q);
	if (rt != NULL)
	{
    
    
		printf("%s\n", rt);
		return 0;
	}
	return 0;
}

(5)strcpy / strncpy字符串拷贝

char* strcpy_my(char* des_str, const char* src_str)
{
    
    
	if (des_str == NULL || src_str == NULL)
		return NULL;
	char* p = des_str;
	while (*src_str != '\0')
	{
    
    
		*p++ = *src_str++;
	}
	*p = '\0';
	return des_str;
}

char* strncpy_my(char* des_str, const char* src_str, size_t len)
{
    
    
	if (des_str == NULL || src_str == NULL || len <= 0)
		return NULL;
	char* p = des_str;
	//源字符串实际长度
	int cur_len = strlen(src_str) <= len ? len : strlen(src_str);
	
	while (cur_len--)
	{
    
    
		*p++ = *src_str++;
	}
	*p = '\0';
	return des_str;
}

int main()
{
    
    
	const char* p = "hello";
	char q[10] = {
    
    0};
	
	if (strncpy_my(q, p, 1) != NULL)
	{
    
    
		printf("%s\n", q);
	}

	return 0;
}

(6)strcat / strncat字符串的粘贴

char* strcat_my(char* des_str, const char* src_str)
{
    
    
	if (des_str == NULL || src_str == NULL)
		return NULL;
	int len_des = strlen(des_str);
	char* p = des_str + len_des;

	while (*src_str != '\0')
	{
    
    
		*p++ = *src_str++;
	}
	return des_str;
}

char* strncat_my(char* des_str, const char* src_str, size_t len)
{
    
    
	if (des_str == NULL || src_str == NULL || len < 0)
		return NULL;
	int len_des = strlen(des_str);
	char* p = des_str + len_des;
	

	while (len--)
	{
    
    
		*p++ = *src_str++;
	}
	return des_str;
}

int main()
{
    
    
	char p[20] = "hello";
	const char* q = "world";
	printf("p = %s\n", p);
	printf("q = %s\n", q);
	if (strncat_my(p, q, 3) != NULL) 
	{
    
    
		printf("p = %s\n", p);
	}
	printf("q = %s\n", q);
	return 0;
}

(7)strdup 字符串申请堆区空间存放字符串的副本

char* strdup_my(const char* src_str)
{
    
    
	if (NULL == src_str)
		return NULL;
	char* newspace = (char*)malloc((strlen(src_str) + 1 ) * sizeof(char));
	if (newspace == NULL)
		return NULL;
	int i = 0;
	while (*src_str != '\0')
	{
    
    
		newspace[i++] = *src_str++;
	}
	newspace[i] = '\0';
	return newspace;
}
int main()
{
    
    
	const char* p = "hello";
	char* q = strdup_my(p);
	if (q != NULL)
	{
    
    
		printf("%s\n", q);
		free(q);
		q == NULL;
	}
	return 0;
}

猜你喜欢

转载自blog.csdn.net/xiaoxiaoguailou/article/details/121267391