字符串和内存函数

学习目标:字符串 和 内存函数

  • 字符函数和字符串函数😀
  • 内存函数💜

学习内容:

  • 求字符串长度
    ৹ strlen
  • 长度不受限制的字符串函数
    ৹ strcpy
    ৹ strcat
    ৹ strcmp
  • 长度受限制的字符串函数介绍
    ৹ strncpy
    ৹ strncat
    ৹ strncmp
  • 字符串查找
    ৹ strstr
    ৹ strtok

函数的具体实现与模拟实现:

  • 求字符串函数 —strlen

1
∘ strlen—求字符串长度
size_t strlen ( const char * str );
//参数是所求字符串的地址(指针)
//返回值为无符号整型数,即字符串中字符的个数
下面展示一下strlen的使用

int main()
{
	char ch[] ="abcdef"; //  abcdef\0
	printf("%d",strlen(ch));//屏幕打印 `6`
}

😈需要注意strlen在计算字串个数时,’ \0’ 是其结束标志,也就是说strlen统计的是字符串中第一个’\0’之前的字符个数。

2
∘ 模拟实现strlen

int my_strlen(const char* str)
{
	int count = 0;
	while(*str++ != '\0')//遇到\0停止循环
	{
		count++;
	}
	return count;
}

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

— strcpy
1
strcpy —字符串的复制
char * strcpy ( char * destination, const char * source );
//参数 destination 为指向接收复制内容的指针,source为指向将要被复制内容的指针
//返回值为目的指针
下面展示一下strlen的使用

int main()
{
	char str1[] ="hello world"; 
	char str2[20] ={0}; 
	strcpy(str2,str1);//将str1中的内容复制到str2中去	
	pritnf("%s\n",str2);
	//输出为 hello world
}

2
模拟实现strlen

char* my_strcpy(char * dest, const char * src )
{
	char* p = dest;
	while(*dest++ = *src)
	{
		;
	}
	return p;
}

—strcat
1
strcat —字符串的追加
char * strcpy ( char * destination, const char * source );
//参数 destination 为指向接收复制内容的指针,source为指向将要被复制内容的指针
//返回值为目的指针
下面展示一下strcat的使用

int main()
{
	char str1[20] = "abc\0xxxxx";
	char str2 []= "qer";
	strcat(str1, str2);
	printf("%s", str1);//屏幕打印为abcqer
	return 0; 
}

😈需要注意strcat,’ \0’ 是进行追加起始标志,也就是从’\0’位置进行追加,完成后在末尾再添加一个‘\0’.

2
模拟实现strcat

char* my_strcat(char* str1, char* str2)
{
	char* p = str1;
	while (*str1)
	{
		str1++;
	}
	while (*str1++ = *str2++)
	{
		;
	}
	return p;
}

—strcmp
1
strcat —字符串的比较
int strcmp ( const char * str1, const char * str2 );
//参数 str1 str2 是进行比较的2个字符串
//返回值为整型:1 / -1 / 0
相等0 - str1<str2返回-1 - 反之返回1
下面展示一下strcat的使用

int main()
{
	char str1[] = "abc";
	char str2 []= "qer";
	int n = strcmp(str1, str2);
	printf("%d", n);//屏幕打印 -1
	return 0;
}

2
模拟实现strcmp

int my_strcmp(char* str1, char* str2)
{
	while ((*str1 != '\0')  && (*str1 == *str2))
	{
			str1++;
			str2++;
	}	
	return *str1 - *str2;//模拟实现strcmp,返回负数为str1<str2;返回负数为str1>str2;返回0为str1=str2;
}


  • 长度受限制的字符串函数

—strncpy
1
strncpy—复制num个字符
char * strncpy ( char * destination, const char * source, size_t num );
//参数 与strncpy相比较,多了一个参数num,表示要从source复制的最大字符数
//返回值:返回destination

下面展示一下strcat的使用

int main()
{
	char str1[20] = "abcdxxxxxxx";
	char str2[] = "efgh";
	strncpy(str1, str2, 2);
	printf("%s", str1);//屏幕输出:efcdxxxxxxx
	return 0;
}

2
模拟实现strncpy

char* my_strncpy(char* dest,  char* src, int n)
{
	char* p = dest;
	assert(dest != NULL);
	int sz = sizeof(src) / sizeof(char);
	while (n--)
	{
		*dest++ = *src++;
	}
	return p;
}

针对strncat、strncmp同样类似于strncpy,较长度不受限制的字符串函数,多了一个可以控制的最大字符数参数num。


  • 字符串查找

—strstr
1
strstr — 在字符串1中查找字符串2
const char * strstr ( const char * str1, const char * str2 );
````````````````·char * strstr ( char * str1, const char * str2 );
在str1中查找str2
返回指向 str1 中第一次出现的 str2 的指针,如果 str2 不是 str1 的一部分,则返回一个空指针。
下面展示一下strcat的使用

int main()
{
	char str1[] = "abcdef";
	char str2[] = "bcd";
	char* p = strstr(str1, str2);
	printf("%s", p);//屏幕打印 - bcdef
	return 0;
}

2
模拟实现strstr

char* my_strstr(char* str1, const char* str2)
{
	char* s1 = NULL;
	char* s2 = NULL;
	char* cp = str1;
	while (*cp)
	{
		s1 = cp;
		s2 = str2;
		while (*s1 && *s2 && *s1 == *s2)
		{
			s1++;
			s2++;
		}
		if (*s2 == '\0')
		{
			return cp;
		}
		cp++;
	}
	return NULL;
}

—strtok
1
strtok—将字符串拆分为标记-这些标记是由分隔符中的任何字符分隔的连续字符序列
char * strtok ( char * str, const char * delimiters );
参数:str为要拆分的字符串,delmitters为分隔字符序列
如果找到分隔符,则返回指向分隔符开头的指针。 否则为空指针。 当在正在扫描的字符串中到达字符串的末尾(即空字符)时,始终返回空指针.
下面展示一下strcat的使用

int main()
{
	char str1[] = "www.maw@1234-MWI";
	char str2[] = ".@-";				//
	char* p = strtok(str1, str2);
	while (p != NULL)
	{
		printf("%s ", p);//屏幕输出WWW maw 1234 MWI
		p = strtok(NULL, str2);----------------------------------------(*)
	}
	return 0;
}

😈在后续调用中,该函数需要一个空指针,并使用上一个分隔符末尾之后的位置
作为扫描的新起始位置。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值