通俗易懂说(C语言常用函数之)(1)strchr,strrchr,memchr,strstr,strspn, memcmp

1. strchr

1.1 函数原型

原型: char *strchr(const char *str, char ch)
参数: 字符串str,查找的字符ch
返回值: 返回字符ch在字符串str中第一次出现的位置
注意: strchr, strrchr - locate character in string

1.2 功能

查找字符串str中第一次出现字符ch的位置

1.3 实现

//strchr函数实现
char *strchr(char *str, char ch)
{
	//省略参数判断
	while( *str++ && (*str != ch) ) //从头到尾遍历字符串str,直到找到字符与目标ch相等为止
	;							   //若遍历到字符串结尾‘'\0'还没找到则结束
	return *str == ch ? str:NULL  //这里用到了三元运算符,找到则返回字符串的位置,否则NULL
}

1.4 例子

			char haystack[20] = "HelloHaniGood";
            char needle[10] = "Hani";
            char *ret=NULL;
            //ret = strstr(haystack, needle);
            ret = strchr(haystack, 'o');
            if(NULL != ret){
                    printf(": %s\n", ret);
            }
结果:
[root@localhost home]# ./a.out 
: oHaniGood
[root@localhost home]# 

2. strrchr

2.1 函数原型

原型: char *strrchr(const char *str, char ch)
参数: 字符串str,查找的字符ch
返回值: 返回字符ch在字符串str中最后一次出现的位置
注意: strchr, strrchr - locate character in string

2.2 功能

查找字符串str中最后一次出现字符ch的位置

2.3 实现

//strrstr 函数实现
char *strrchr(char *str, char ch)
{
	//省略参数判断
	char *pcStartTmp = str;//使用一个临时变量指向字符串开头
	while(*str++)  //使str指向字符串结尾最后一个字符
	;
	while( --str !=  pcStartTmp  && (*str != ch) ) //从尾到头遍历字符串str,直到找到字符与目标ch相等为止
	;							   //若遍历到字符串开头还没找到则结束
	return *str == ch ? str:NULL  //这里用到了三元运算符,找到则返回字符串的位置,否则NULL
}

2.4 例子

			char haystack[20] = "HelloHaniGood";
            char needle[10] = "Hani";
            char *ret=NULL;
            //ret = strstr(haystack, needle);
            ret = strrchr(haystack, 'o');
            if(NULL != ret){
                    printf(": %s\n", ret);
            }
结果:
[root@localhost home]# ./a.out 
: od
[root@localhost home]#

3. memchr

3.1 原型:

void *memchr(const void *str, int c, size_t n)

memchr, memrchr - scan memory for a character

3.2 功能

在参数 str 所指向的字符串的前 n 个字节中搜索第一次出现字符 c(一个无符号字符)的位置。

3.3 参数

str – 指向要执行搜索的内存块。
c – 以 int 形式传递的值,但是函数在每次字节搜索时是使用该值的无符号字符形式。
n – 要被分析的字节数。

3.4 返回值

该函数返回一个指向匹配字节的指针,如果在给定的内存区域未出现字符,则返回 NULL。

3.5 例子

const char str[] = "http://www.baidu.com";
const char ch = '.';
char *ret = NULL;
ret = (char*)memchr(str, ch, strlen(str));
printf("|%c| 之后的字符串是 - |%s|\n", ch, ret);
结果: 
	.| 之后的字符串是 - |.baidu.com|

3.6 memchr 和 strchr 的区别

memchr检测的是一段内存,strchr检测的是一个字符串 如果一段内存中有0x0的话,不能用strchr去查找的,因为遇到0x0会当作字符串的结束符停止。而mem是根据后面的n停止

4. strstr

4.1 原型:

char *strstr(const char *pcSrc, const char *pcDes)

pcSrc搜索的目标字符串
pcDes查找的子字符串

4.2 功能

在字符串 pcSrc中查找第一次出现字符串 pcDes的位置,不包含终止符 ‘\0’。

4.3 参数

pcSrc-- 要被检索的 C 字符串。
pcDes-- 在 pcSrc字符串内要搜索的小字符串。

4.4 返回值

该函数返回一个指向匹配字节的指针,如果在给定的内存区域未出现字符,则返回 NULL。

4.5 例子

char acSrc[20] = "HelloHaniGood";
char acDes[10] = "Hani";
 char *ret=NULL;
 ret = strstr(acSrc, acDes);
 if(NULL != ret){
     printf(": %s\n", ret);
  }
  
结果: 
root@localhost home]# ./a.out 
: HaniGood
[root@localhost home]# 

5. strspn

5.1 原型:

size_t strspn(const char *str1, const char *str2)

5.2 功能

检索字符串 str1 中第一个不在字符串 str2 中出现的字符下标

5.3 参数

str1 – 要被检索的 C 字符串。
str2 – 该字符串包含了要在 str1 中进行匹配的字符列表。

5.5 返回值

该函数返回 str1 中第一个不在字符串 str2 中出现的字符下标。

5.5 例子

int len;
const char str1[] = "ABCD1EFG019874";
const char str2[] = "12EF3ABCD";
len = strspn(str1, str2);
printf("初始段匹配长度 %d\n", len );
结果:
	初始段匹配长度 7

5.6 strcspn

检索字符串 str1 开头连续有几个字符都不含字符串 str2 中的字符。
返回值
该函数返回 str1 开头连续都不含字符串 str2 中字符的字符数。

int len;
const char str1[] = "AB1CD123EFG012374";
const char str2[] = "4123";
len = strcspn(str1, str2);
printf("初始段匹配长度 %d\n", len );
结果: 
	初始段匹配长度 2

6. memcmp

int memcmp(const void *str1, const void *str2, size_t n)) 

功能:

把存储区 str1 和存储区 str2 的前 n 个字节进行比较

参数:

str1 -- 指向内存块的指针。
str2 -- 指向内存块的指针。
n -- 要被比较的字节数。

返回值:

如果返回值 < 0,则表示 str1 小于 str2。
如果返回值 > 0,则表示 str1 大于 str2。
如果返回值 = 0,则表示 str1 等于 str2。

代码例子:

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

#define STR_LEN 64

int main ()
{
		char str1[STR_LEN];
		char str2[STR_LEN];
		int ret = 0;

		memset(str1, 0, sizeof(str1));
		memset(str2, 0, sizeof(str2));

		memcpy(str1, "abcdef", STR_LEN);
		memcpy(str2, "abcdef", STR_LEN);

		ret = memcmp(str1, str2, STR_LEN);

		if(ret > 0)
		{
				printf("str2 小于 str1\n");
		}
		else if(ret < 0)
		{
				printf("str1 小于 str2\n");
		}
		else
		{
				printf("str1 等于 str2\n");
		}

		return(0);
}

结果:

[root@localhost home]# gcc memcmp.c 
[root@localhost home]# ./a.out 
str1 等于 str2
[root@localhost home]# 
  • 3
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值