strlen,strcpy,strcat,strcmp,strstr详解及模拟+strncpy,strncat,strncmp

目录

🧃求字符串长度

🍕strlen函数——测量字符串长度的函数

🚗strlen模拟实现

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

🍕strcpy函数——字符串复制函数

🚗strcpy的模拟实现

🍕strcat——字符串追加函数

🚗模拟实现stract

 🍕strcmp——字符串比较函数

🚗模拟strcmp

 🧃长度受限制字符串

🍕strncpy——拷贝num个

🍕strncat——追加num个

🍕strncmp——比较num个

🧃字符串查找

🍕strstr

🚗模拟strstr


🧃求字符串长度

🍕strlen函数——测量字符串长度的函数

size_t strlen ( const char * str );

1.字符串已经'\0'作为结束标志,strlen函数返回的是'\0'前面出现的字符个数,不包含‘\0’。

🧡💛💚💙💜
#include<stdio.h>
#include<string.h>
int main()
{
	char str1[] = "xiaoyan";
	char str2[] = { 'x','i','a','o' };//str2没有'\0',故结果为随机值
	char str3[] = { 'x','i','a','o','\0' };


	printf("%d\n", strlen(str1));//7
	printf("%d\n", strlen(str2));//19随机值
	printf("%d\n", strlen(str3));//4
}

 

2.strlen返回值为size_t,无符号类型(注意)

🔴🟠🟡🟢🔵

#include<stdio.h>
#include<string.h>
int main()
{
	if (strlen("yan") - strlen("xiao") > 0)//strlen返回值为无符号类型
	{
		printf(">\n");
	}
	else
	{
		printf("<=\n");
	}
	printf("%u\n", strlen("yan") - strlen("xiao"));//用无符号类型进行打印
}

运行结果为:  

🚗strlen模拟实现

三种方法

//计数器方式
int my_strlen(const char * str)
{
 int count = 0;
 while(*str)
 {
  count++;
  str++;
 }
 return count;
}
//不能创建临时变量计数器
int my_strlen(const char * str)
{
 if(*str == '\0')
  return 0;
 else
  return 1+my_strlen(str+1);
}
//指针-指针的方式
int my_strlen(char *s)
{
   char *p = s;
   while(*p != ‘\0’ )
       p++;
   return p-s;
}

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

🍕strcpy函数——字符串复制函数

形式为:strcpy(目标字符串,源字符串),作用:将源字符串复制到目标字符串中.

注意事项:源字符串以'\0'结束。会将源字符串中的'\0'拷贝到目标空间。所以要求目标空间必须是可变的且足够大,以确保能够存放源字符串。

❤🧡💛💚💙
#include <stdio.h>
#include <string.h>
//strcpy简单使用
int main()
{
	char arr1[20] = {0};
	char arr2[] = "xiaoyan";
	strcpy(arr1, arr2);
	printf("%s", arr1);
	return 0;
}

运行结果:

🧡💛💚💙💜
#include <stdio.h>
#include <string.h>
//通过调试细节观察
int main()
{
	char arr1[6] = "xxxxx";
	char arr2[] = "yan";
	strcpy(arr1, arr2);
	printf("%s", arr1);
	return 0;
}

🚗strcpy的模拟实现


#include<assert.h>
char* my_strcpy(char* dest, char* src)
{
	assert(dest && src);
	char* ret = dest;
	while(*dest++=*src++)
	{
		;
	}
	return ret;
}
int main()
{
	char arr1[20] = { 0 };
	char* arr2 = "hhh";
	my_strcpy(arr1, arr2);
	printf("%s", arr1);
	return 0;
}

🍕strcat——字符串追加函数

char *strcat( char *strDestination, const char *strSource );

     strcat函数将strSource追加到strDestination,并以一个空字符结束结果字符串。strSource的起始字符将覆盖结束strDestination的空字符。

 源字符串必须以'\0'结尾;

目标函数必须有足够大的空间,能容下源字符串的内容;

目标空间必须可修改;

#include<stdio.h>
#include<string.h>
int main()
{
	//简单看一下效果
	char arr1[20] = "xiao";
	char arr2[] = "yan";
	strcat(arr1, arr2);//字符串追加(链接)
	printf("%s", arr1);

	return 0;
}

运行结果为,为了看出到底是如何追加的我们将char1改成“xiao\0xxxxxxx”,进行调试看一下

#include<stdio.h>
#include<string.h>
int main()
{
	char arr1[20] = "xiao\0xxxxxxx";//更换后
	char arr2[] = "yan";
	strcat(arr1, arr2);//字符串追加(链接)
	printf("%s", arr1);

	return 0;
}

 调试的结果如下:可以看出'\0'被y覆盖。可以将strcat函数看成两步,第一步:找到目标字符串的'\0',源字符串追加过去并且包含'\0'.

🚗模拟实现stract

char* my_stract(char* dest, char* src)
{
	assert(dest&&src);
	char* ret = dest;
	while (*dest)
	{
		dest++;
	}
	//拷贝
	while (*dest++ = *src++)
	{
		;
	}
	return ret;
}
int main()
{
	char arr1[20] = "hello";
	char arr2[] = "bit";
	my_stract(arr1, arr2);
	printf("%s", arr1);
	return 0;
}

 🍕strcmp——字符串比较函数

int strcmp( const char *string1, const char *string2 );

标准规定第一个字符串大于第二个字符串,则返回大于零的数字,相等则返回0;小于返回小于零的数。那么是如何进行比较的呢,以“a”和“b”来说,在字典中a排在b的前面a就比b大,返回大于零的数;对于“ae”和“ac",由于第一个字母是一样的,所以我们继续比较下一个,因为e在c的后面,所以返回小于零的数。

#include<stdio.h>
#include<string.h>
int main()
{
	int ret = strcmp("abc", "abe");
	printf("%d\n", ret);
	return 0;
}

运行结果为

🚗模拟strcmp

//模拟strcmp
my_strcmp(const char*s2,const char*s1)
{
	assert(s1 && s2);
	while (*s1 == *s2)
	{
		if (*s1 == 0)
		{
			return 0;
		}
		s1++;
		s2++;
	}
	return *s1 - *s2;
}
int main()
{
	char arr1[] = "abd";
	char arr2[] = "abc";
	int ret = strcmp(arr1, arr2);
	if (ret > 0)
	{
		printf(">\n");
	}
	else if(ret == 0)
	{
		printf("==\n");
	}
	else
	{
		printf("<\n");
	}
	printf("%d", ret);
	return 0;
}

 🧃长度受限制字符串

🍕strncpy——拷贝num个

  • char * strncpy ( char * destination, const char * source, size_t num );
  • 如果源字符串的长度小于num,则拷贝完源字符串之后,在目标的后边追加0,直到num个
  • 拷贝num个字符从源字符串到目标空间
#include<stdio.h>
#include<string.h>
int main()
{
	char arr1[20] = "abcdef";
	char arr2[] = "gh";
	strncpy(arr1, arr2, 1);
	printf("%s", arr1);//输出结果gbcdef
	return 0;
}

🍕strncat——追加num个

  • char * strncat ( char * destination, const char * source, size_t num );
  • Appends the first num characters of source to destination, plus a terminating null-character.
  • If the length of the C string in source is less than num, only the content up to the terminatingnull-character is copied
#include<stdio.h>
#include<string.h>
int main()
{
	char arr1[20] = "abcdef\0xxxxxx";
	char arr2[] = "ghijk";
	strncat(arr1, arr2, 5);
	printf("%s", arr1);//输出结果为abcdefghijk
	return 0;
}

🍕strncmp——比较num个

  • int strncmp ( const char * str1, const char * str2, size_t num );
#include<stdio.h>
#include<string.h>
int main()
{
	char arr1[] = "abcdef";
	char arr2[] = "bcd";
	int ret = strncmp(arr1,arr2,3);//arr1和arr2的前三个进行比较
	//abc和bcd进行比较,a<b
	printf("%d", ret);//a<b返回小于零的数(vs2019下返回-1)
	return 0;
}

🧃字符串查找

🍕strstr

  • char * strstr ( const char *str1, const char * str2);
  • Returns a pointer to the first occurrence of str2 in str1, or a null pointer if str2 is not part ofstr1
#include<stdio.h>
#include<string.h>
int main()
{
	char arr1[] = "abcdefcdeh";
	char arr2[] = "cdef";
	char*ret=strstr(arr1, arr2);
	if (ret == NULL)
	{
		printf("找不到");
	}
	else
	{
		printf("%s\n", ret);//cdefcdeh
	}
	return 0;
}

🚗模拟strstr

char* my_strstr(char* str1, char* str2)
{
	char* s1 = str1;
	char* s2 = str2;
	char* cur = str1;
	while (*cur)
	{
		s1 = cur;
		s2 = str2;


		while (*s1&&*s2&&* s1 == *s2)
		{
			s1++;
			s2++;
		}
		if (*s2 == '\0')
		{
			return cur;
		}
		cur++;
	}
	return NULL;//找不到
}
int main()
{
	char arr1[] = "abcdeqabcdef";
	char arr2[] = "cdef";
	char* ret = my_strstr(arr1, arr2);
	if (ret == NULL)
	{
		printf("找不到子串\n");
	}
	else
	{
		printf("%s\n", ret);
	}
	return 0;
}

  • 9
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值