C语言基础:字符串函数使用和剖析(2)

strcmp(字符串比较,比较两个字符串是否相等)

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

int main()
{
	const char* p1 = "abcdef";
	const char* p2 = "sqwer";
	if ("abcdef" == "sqwer")//千万不能这么比较,因为拿的是首元素地址在比较
	{

	}
	return 0;
}

 标准规定:

  • 第一个字符串大于第二个字符串,则返回大于0的数字
  • 第一个字符串等于第二个字符串,则返回0
  • 第一个字符串小于第二个字符串,则返回小于0的数字  

字符串是怎么比较的:是比字符串的多少吗?当然不是,比的是字符的ASCII码,

从第一个字符开始比,第一个字符分出大小的话就不用再往下比了,第一个字符相等,再比较第二个字符。 

模拟实现:

#include<assert.h>
#include<string.h>

int  my_strcmp(const char* str1, const char* str2)
{
	assert(str1 && str2);
	//比较
	while (*str1 == *str2)
	{
		if (*str1 == '\0')
		{
			return 0;
		}
		str1++;
		str2++;
	}
	if (*str1 > *str2)
		return 1;
	else
		return -1;
}
int main()
{
	const char* p1 = "abcdef";
	const char* p2 = "abqwe";
	int ret = my_strcmp(p1, p2);
	printf("%d", ret);
	return 0;
}

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

strncpy(字符串拷贝)

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

 num的单位是字节,size_t是无符号整形

  • 拷贝num个字符从源字符串到目标空间。不把\0拷贝过去
  • 如果源字符串的长度小于num,则拷贝完源字符串之后,在目标的后边追加0,直到num个。

模拟实现这个函数自己可以做一做

strncat(字符串追加)

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

  • 目标空间必须有足够的大,能容纳下源字符串的内容。
  • 源字符串必须以 '\0' 结束。

strncmp (字符串比较)

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

strstr (查找字符串)

char * strstr ( const char *str1, const char * str2);

NULL--空指针      

NUL或Null-'\0' 

使用方法:

#include<string.h>
int main()
{
	const char* p1 = "abcdefhi";
	const char* p2 = "def";
	const char* ret = strstr(p1, p2);
	if (ret == NULL)
	{
       printf("子串不存在\n");
	}
	else
	{
		printf("%s\n", ret);
	}

}

没有const不行,常量字符串是无法更改的,此时p1,p2为常量指针

什么是常量指针?常量指针即是指向常量的指针,指针的值可以改变,指针所指的地址中的内容为常量不能改变,

注意事项

  • 如果字符串存在的话,返回在第一个字符串存在位置的第一个地址,
#include<string.h>
int main()
{
	const char* p1 = "abcdefabdef";
	const char* p2 = "def";
	const char* ret = strstr(p1, p2);
	if (ret == NULL)
	{
       printf("子串不存在\n");
	}
	else
	{
		printf("%s\n", ret);
	}

}

 此时出现了两个def,第一个位置的d地址被返回,从而打印defabdef

模拟实现:例如

abbbcdef

bbc

#include<string.h>
#include<assert.h>
const char* my_strstr(const char* p1, const char* p2)//开辟一个形参,我们只是找子字符串,不会更改里面内容
{
	assert(p1 != NULL);
	assert(p2 != NULL);
	//特殊情况处理  p2=""
	const char* s1 = p1;
	const char* s2 = p2;
	const char* cur = p1;
	if (*p2 == '\0')
	{
		return p1;
	}
	while (*cur)//保证p1不为空字符串
	{
		s1 = cur;
		s2 = p2;
		while ((*s1!='\0')&&(*s2 != '\0') && (*s1 == *s2))
		{
			s1++;
			s2++;
		}
		if (*s2 == '\0')
		{
			return cur;//找到字符串
		}
        if (*s1 == '\0')
		{
			return NULL;
		}
		cur++;
	}
	return NULL;//找不到字符串
}

int main()
{
	const char* p1 = "abcdefabdef";
	const char* p2 = "defq";
	const char* ret = my_strstr(p1, p2);
	if (ret == NULL)
	{
       printf("子串不存在\n");
	}
	else
	{
		printf("%s\n", ret);
	}

}

 这个代码有点复杂,自己可以慢慢理解;

学过数据结构可以了解一下KMP算法

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值