C语言中strcmp、strstr、strchr函数的使用和指针实现

本文介绍了C语言中用于字符串比较和查找的三个函数:strcmp用于比较两个字符串的大小,返回值表示它们的相对顺序;strstr用来查找字符串str2是否为str1的子串,返回其在str1中的位置或NULL;strchr则用于在字符串s中找到字符c首次出现的位置,找不到则返回NULL。同时还提供了这三个函数的指针实现代码。

strcmp函数:
函数原型:extern int strcmp(const char *s1,const char *s2);

函数用于比较两个字符串的大小,自左向右逐个字符比较,直到出现不同字符或者‘\0’。
返回值等于0时:s1 = s2
返回值大于0时:s1 > s2
返回值小于0时:s1 < s2

strstr函数:
函数原型:extern char *strstr(char *str1, const char *str2);

strstr函数用于判断字符串str2是否是str1的子串。
如果是,则该函数返回str2在str1中首次出现的地址;
反之,返回NULL。

strchr函数:
函数原型:char *strchr(const char *s, int c);

strchr函数用于查找字符串s中首次出现字符c的位置的指针。
如果不存在返回NULL。

下面是strcmp strstr strchr函数的使用,及其指针实现代码:

#include <stdio.h>
#include <string.h>

int my_strcmp(char *src, char *dst);/*strcmp函数的实现*/
char *my_strchr(char *string, int ch);/*strchr函数的实现*/
char *my_strstr(char *str1, char *str2);/*strstr函数的实现*/

int main()
{
	char *str1	     = "abcdefg";
	char *str2       = "abcdifg";
	char *str3       = "abcdef-123456";
	char *str4       = "abcdefghijk112233";
	char *str5       = "ghij";
	char *str_chr    = NULL;
	char *my_str_chr = NULL;
	char *str_str    = NULL;
	char *my_str_str = NULL;
	int ret = 0;

	ret = strcmp(str1, str2);/*标准库的调用*/
	if(ret == 0){
		printf("strcmp: str1 = str1\n");
	}else if(ret > 0){
		printf("strcmp: str1 > str2\n");
	}else{
		printf("strcmp: str1 < str2\n");
	}

	ret = 0;
	ret = my_strcmp(str1, str2);/*调用自己的strcmp函数*/
	if(ret == 0){
		printf("my_strcmp: str1 = str1\n");
	}else if(ret > 0){
		printf("my_strcmp: str1 > str2\n");
	}else{
		printf("my_strcmp: str1 < str2\n");
	}

	str_chr = strchr(str3, '-');/*标准库函数strchr的调用*/
	printf("strchr: %s\n", str_chr);

	my_str_chr = my_strchr(str3, '-');/*调用自己的strchr函数*/
	printf("my_str_chr: %s\n", my_str_chr);

	str_str = strstr(str4, str5);/*标准库函数strstr的调用*/
	printf("strstr: %s\n", str_str);

	my_str_str = my_strstr(str4, str5);/*调用自己的strstr函数*/
	printf("my_strstr: %s\n", my_str_str);

	return 0;
}

int my_strcmp(char *src, char *dst)/*strcmp函数的实现*/
{
	int ret = 0;
	while(!(ret = *(unsigned char *)src - *(unsigned char *)dst) && *dst){
		src++;
		dst++;
	}

	if(ret < 0){
		ret = -1;
	}else if(ret > 0){
		ret = 1;
	}

	return ret;
}

char *my_strchr(char *string, int ch)/*strchr函数的实现*/
{
	while(*string && *string != (char)ch){
		string++;
	}

	if(*string == (char)ch)
		return (char *)string;
	return NULL;
}

char *my_strstr(char *str1, char *str2)/*strstr函数的实现*/
{
	char *cp = str1;
	char *s1 = NULL;
	char *s2 = NULL;

	if(!*str2){
		return str1;
	}

	while(*cp){
		s1 = cp;
		s2 = str2;

		while(*s1 && *s2 && !(*s1 - *s2)){
			s1++;
			s2++;
		}

		if(!*s2){
			return cp;
		}
		cp++;
	}

	return NULL;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值