我是靠谱客的博主 专注向日葵,最近开发中收集的这篇文章主要介绍模拟实现库函数之字符串函数一 、求字符串长度二 、长度不受限制的字符串函数三 、长度受限制的字符串函数总结,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

目录

一 、求字符串长度

strlen 函数

二 、长度不受限制的字符串函数

strcpy函数

strcat函数

strcmp函数

三 、长度受限制的字符串函数

strncpy函数

 strncat函数

strncmp函数

总结


一 、求字符串长度

  • strlen 函数

size_t strlen ( const char * str );//返回值为unsigned int类型

strlen函数是c语言的库函数,用来计算字符串的长度,遇到截止。

//举例
char str[]="seanyibo";
int len=strlen(str);//8

模拟实现strlen函数:

size_t my_strlen(const char* str) {
	char* start = str;
	char* end = str;
	while (*end != '') {
		end++;
	}
	return end - start;//指针相减即为它们之间的元素个数
}

int main() {
	char str[] = "bjyxdaydayup";
	int len=my_strlen(str);
	printf("%d", len);//12
	return 0;
}

额外说明:我们前面有提到size_t为unsigned int 类型,这是因为字符串的长度不可能为负值,下面我们用一段代码来证明它。

二 、长度不受限制的字符串函数

  • strcpy函数

char* strcpy(char* destination,const char* source);

strcoy函数是c语言的库函数,将源(source)指向的C字符串复制到目标(destination)指向的数组中,包括终止空字符(并在该点停止)。

然而,我们需要注意以下几点:

1.我们的目标数组的长度必须大于等于我们的源数组;

2.源数组中必须包含‘’,否则无法确定有无'’或者‘’的位置在哪儿,可能会造成数组越界,非法访问。

模拟实现strcpy函数:

char* my_strcpy(char* dest, const char* sour) {
	assert(dest);//防止传入的是空指针
	assert(sour);
	char* start = dest;
	while (*dest++ = *sour++) {//复制完停止
		;
	}
	return start;//返回数组首元素地址
}
int main() {
	char str1[20] = "xxxxxx";
	char str2[] = "bjyx";
	//strcpy(str1, str2);
	my_strcpy(str1, str2);
	printf("%s", str1);
	return 0;
}
  • strcat函数

char * strcat ( char * destination, const char * source );

strcat是c语言库函数,将源字符串的内容附加到目标字符串。目标中的第一个终止空字符被源字符串的第一个字符覆盖,直到将原字符串全部完成(包括结束符),并且空字符包含在由目标中的两个字符串联形成的新字符串的末尾。

举例说明:

int main() {
	char str1[20] = "bjyx";
	char str2[] = "szd";
	strcat(str1, str2);
	printf("%s", str1);//bjyxszd
	return 0;
}

然而,我们需要注意的是:

1.目标字符数组的长度必须够容纳两个字符数组;

反例:char str1[6]="abcd";char str2[]="efghi";//报错,数组越界

2.源字符串必须以‘’结束;

3.目标空间必须可变。

模拟实现strcat函数:

char* my_strcat(char* dest, const char* sour) {
	//找到位置
	assert(dest && sour);
	char* str = dest;
	while (*str != '') {
		str++;
	}
	//将内容复制到后的空间
	while (*str++ = *sour++) {//复制完后结束
		;
	}
	return dest;//返回起始地址
}
int main() {
	char str1[20] = "bjyx";
	char str2[] = "szd9197";
	//strcat(str1, str2);
	printf("%sn", my_strcat(str1,str2));//bjyxszd9197
	return 0;
}

注:strcat函数不能实现自己追加自己;因为此时的‘’已经被修改了。自己追加自己可以通过下述

strncat函数实现。

  • strcmp函数

int strcmp ( const char * str1, const char * str2 );

strcmp函数是c语言库函数,比较两个字符串的大小,从第一个元素开始,依次比较(比较的是对应位置上的字符的大小),并非长度

判断字符串大小的例子如下图:

strcmp函数模拟实现:

int my_strcmp(const char* s1, const char* s2) {
	assert(s1 && s2);
	while (*s1 == *s2) {//相等往后++
		if (*s1 == '')return 0;
		s1++;
		s2++;
	}
	return *s1 - *s2;
}
int main() {
	char str1[] = "abx";
	char str2[] = "abcdef";
	int ret = my_strcmp(str1, str2);//>0,因为‘x’>'c'
	if (ret > 0)printf(">");
	else if (ret < 0)printf("<");
	else printf("=");
	return 0;
}

三 、长度受限制的字符串函数

  • strncpy函数

char * strncpy ( char * destination, const char * source, size_t num );//num表示传递的元素个数

strncpy为c语言库函数,能够实现从源字符串中拷贝num个元素到目标字符串中。

//举例    
    char str1[] = "wybxz!!!!!";
  //char str1[]="wxhaha"
	char str2[20] = { 0 };
	strncpy(str2, str1, 6);
	printf("%sn", str2);//wybxz!
  //printf("%sn",str2);//wx

从上图调试中,我们可以看到strncpy在拷贝时,如果num小于字符串长度,并不会在拷贝num个字符后追加上‘’;

然而,如果源字符串的长度小于num或者在复制num个字符之前找到了源字符串的结尾(即‘’),则在拷贝完源字符串后,在后面追加,直到总共拷贝了num个元素。

模拟实现strmcpy函数:

char* my_strncpy(char* dest, const char* src, size_t n) {
	char* start = dest;
	while (n&&(*dest++ = *src++)){//wybxz10 9 8 7 6 5 4 3 2
		n--;
	}
	//字符串长度小于num
	if (n != 0) {
		while (--n) {
			*dest++ = '';
		}
	}
	return start;
}
int main() {
	char str1[] = "wybxz!!!";
	char str2[20] = "hahahahahah";
	//strncpy(str2, str1, 10);
	my_strncpy(str2, str1, 10);
	printf("%sn", str2);
	return 0;
}
  •  strncat函数

char* strncat(char* destination,const char* source,size_t num);

strncat函数是c语言库函数,能够实现将目标字符串后追加num个字符,目标中的第一个终止空字符被源字符串的第一个字符覆盖,直到追加了num个字符。

注意:如果源字符串的长度小于num,则只复制到‘’的内容。

//举例
    char str1[] = "daytoy!!!";
	char str2[18] = "xz_";
	strncat(str2, str1, 6);
	printf("%sn", str2);//xz_daytoy

模拟实现strncat函数:

char* my_strncat(char* dest,const char* src, size_t n) {
	char* cur = dest;
	while (*cur != '') {
		cur++;
	}
	while (n--) {
		if (*src != '')//目标字符串长度大于n或者未遇见''
			*cur++ = *src++;
	}
	//以''结束
	*cur = '';
	return dest;
}
int main()
{
	char str1[] = "daytoy!!!";
	char str2[18] = "xz_";
	//strncat(str2, str1, 6);
	my_strncat(str2, str1, 11);
	printf("%sn", str2);
	return 0;
}

实现自己追加自己:

    char str1[18] = "sean";
	strncat(str1, str1, 4);
    printf("%sn",str1);//seansean

注意:此时的num长度只能为源字符串元素个数,并且源字符数组的空间必须足够大。

  • strncmp函数

int strncmp ( const char * str1, const char * str2, size_t num );

strncmp是c语言库函数,用来比较两个字符串的大小直到出现另一个字符不一样或者一个字符串结束或者num个字符比较完。

int my_strncmp(const char* str1, const char* str2, size_t num) {
	char* s1 = str1;
	char* s2 = str2;
	while (num&&(*s1 == *s2)) {
		if (*s1 == '')return 0;//一个字符串结束
		s1++;
		s2++;
		num--;
	}
	if (num == 0)return 0;//前num个元素都相等
	return *s1 - *s2;//出现不相等字符
}
int main() {
	char str1[] = "happy";
	char str2[] = "habbit";
	//int ret=strncmp(str1, str2, 6);//>0
	int ret= my_strncmp(str1, str2, 6);//>0
	if(ret>0)printf(">");
    else if(ret==0) printf("=");
    else printf("<");
	return 0;
}

总结

以上就是针对部分字符串函数的模拟实现!!!祝大家顺顺利利健健康康,下次见!!!

最后

以上就是专注向日葵为你收集整理的模拟实现库函数之字符串函数一 、求字符串长度二 、长度不受限制的字符串函数三 、长度受限制的字符串函数总结的全部内容,希望文章能够帮你解决模拟实现库函数之字符串函数一 、求字符串长度二 、长度不受限制的字符串函数三 、长度受限制的字符串函数总结所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(51)

评论列表共有 0 条评论

立即
投稿
返回
顶部