通俗易懂说(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]#