• C语言中字符串相关操作函数


    长度

    strlen

    size_t strlen(const char *str)

    功能:返回字符串长度

    strnlen

    size_t strnlen(const char *str, size_t maxlen)

    功能:返回字符串长度,如果长度大于maxlen,返回maxlen

    设置

    memset

    void *memset(void *s, int c, size_t count)

    功能:将s指向的地址,连续count,设置为c。(注意步进为sizeof(char)

    拼接

    strcat

    char *strcat(char *dest, const char *src)

    功能:将源字符串拼接到目标字符串后面

    strncat

    char *strncat(char *dest, const char *src, size_t count)

    功能:将源字符串拼接到目标字符串后面,指定最多拷贝长度

    strlcat

    char *strlcat(char *dest, const char *src, size_t count)

    功能:将源字符串拼接到目标字符串后面,指定目标缓冲区总大小为count

    函数实现:

    size_t strlcat(char *dest, const char *src, size_t count)
    {
    	size_t dsize = strlen(dest);
    	size_t len = strlen(src);
    	size_t res = dsize + len;
    
    	/* This would be a bug */
    	BUG_ON(dsize >= count);
    
    	dest += dsize;
    	count -= dsize;
    	if (len >= count)
    		len = count-1;
    	memcpy(dest, src, len);
    	dest[len] = 0;
    	return res;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17

    比较

    strncasecmp

    int strncasecmp(const char *s1, const char *s2, size_t len)

    功能:不区分大小写、限制长度的字符串比较

    strcasecmp

    int strcasecmp(const char *s1, const char *s2)

    功能:不区分大小写的字符串比较

    strcmp

    int strcmp(const char *cs, const char *ct)

    功能:比较两个字符串

    strncmp

    int strncmp(const char *cs, const char *ct, size_t count)

    功能:比较指定长度的两个字符串

    memcmp

    __visible int memcmp(const void *cs, const void *ct, size_t count)

    功能:比较指定长度的两片内存区域内容是否相等

    bcmp–>memcmp

    # define __visible __attribute__((__externally_visible__))

    拷贝

    strcpy

    char *strcpy(char *dest, const char *src)

    功能:将源字符串拷贝到目的地址,空字符结束

    可能存在目标地址内存空间小,内存访问越界

    strcpy

    char *strncpy(char *dest, const char *src, size_t count)

    功能:将源字符串拷贝到目的地址,空字符或者拷够count个字符结束

    不会主动在拷贝完加尾0

    memcpy

    void *memcpy(void *dest, const void *src, size_t count)

    功能:从源空间拷贝count大小的目标空间

    memmove

    void *memmove(void *dest, const void *src, size_t count)

    功能:从源空间拷贝count大小的目标空间

    与memcpy()不同,memmove()可以处理重叠区域

    在实现中如果dest<src,则正向copy,否则从后向前copy,防止有重叠区

    strlcpy

    size_t strlcpy(char *dest, const char *src, size_t size)

    功能:将一个字符串拷贝到目标缓冲区

    在缓冲区大小size不为0时进行拷贝,最多拷贝size-1个字符,最后添加一个尾\0,

    stpcpy

    char *stpcpy(char *__restrict__ dest, const char *__restrict__ src)

    功能:字符串拷贝

    区别于strcpy在返回值上,stpcpy返回目标字符串的末尾地址。

    strdup

    char *strdup(const char *str)

    功能:将传入字符串,拷贝一份返回

    注意:返回的地址是在函数内部有malloc的,使用完记着free

    函数实现位置:source/tools/include/nolibc/string.h

    static __attribute__((unused))
    char *strndup(const char *str, size_t maxlen)
    {
    	size_t len;
    	char *ret;
    
    	len = strnlen(str, maxlen);
    	ret = malloc(len + 1);
    	if (__builtin_expect(ret != NULL, 1)) {
    		memcpy(ret, str, len);
    		ret[len] = '\0';
    	}
    
    	return ret;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    strndup

    char *strndup(const char *str, size_t maxlen)

    strdup一样,不过多指定了一个最大长度

    查找

    strchr

    char *strchr(const char *s, int c)

    功能:在给定字符串查找是否存在字符c,存在则返回首次出现的位置,不存在返回NULL

    strnchr

    char *strrchr(const char *s, size_t count, int c)

    功能:在给定字符串查找是否存在字符c,存在则返回第一次出现的位置,不存在返回NULL,限制查找次数count

    strchrnul

    char *strchrnul(const char *s, int c)

    功能:在给定字符串查找是否存在字符c,存在则返回第一次出现的位置,不存在返回s结尾的位置。

    strrchr

    char *strrchr(const char *s, int c)

    功能:在给定字符串查找是否存在字符c,存在则返回最后一次出现的位置,不存在返回NULL

    memchr

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

    功能:在给定内存空间查找是否存在字符c,存在则返回首次出现的位置,不存在返回NULL

    strstr

    char *strstr(const char *s1, const char *s2)

    功能:在s1中查找s2,找到返回在s1中的位置,否则返回NULL

    函数实现:

    char *strstr(const char *s1, const char *s2)
    {
    	size_t l1, l2;
    
    	l2 = strlen(s2);
    	if (!l2)
    		return (char *)s1;
    	l1 = strlen(s1);
    	while (l1 >= l2) {
    		l1--;
    		if (!memcmp(s1, s2, l2))
    			return (char *)s1;
    		s1++;
    	}
    	return NULL;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    strnstr

    char *strnstr(const char *s1, const char *s2, size_t len)

    功能:在s1中查找s2指定找len个长度,找到返回在s1中的位置,否则返回NULL

    strspn

    size_t strspn(const char *s, const char *accept)

    功能:该函数返回 s中第一个不在字符串accept中出现的字符下标(初始段匹配长度 )。

    函数实现:

    size_t strspn(const char *s, const char *accept)
    {
    	const char *p;
    
    	for (p = s; *p != '\0'; ++p) {
    		if (!strchr(accept, *p))
    			break;
    	}
    	return p - s;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    strcspn

    size_t strcspn(const char *s, const char *reject)

    功能:该函数返回 s中第一个在字符串reject中出现的字符下标(初始段不匹配长度 )。

    函数实现:

    size_t strcspn(const char *s, const char *reject)
    {
    	const char *p;
    
    	for (p = s; *p != '\0'; ++p) {
    		if (strchr(reject, *p))
    			break;
    	}
    	return p - s;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    strpbrk

    char *strpbrk(const char *cs, const char *ct)

    功能:查找在字符串cs中首次出现ct中任一字符的位置

    函数实现:

    char *strpbrk(const char *cs, const char *ct)
    {
    	const char *sc1, *sc2;
    
    	for (sc1 = cs; *sc1 != '\0'; ++sc1) {
    		for (sc2 = ct; *sc2 != '\0'; ++sc2) {
    			if (*sc1 == *sc2)
    				return (char *)sc1;
    		}
    	}
    	return NULL;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    分割

    char *strsep(char **s, const char *ct)

    函数功能:s为要分解的字符串,delim为分隔符字符串。

    函数实现:

    char *strsep(char **s, const char *ct)
    {
    	char *sbegin = *s;
    	char *end;
    
    	if (sbegin == NULL)
    		return NULL;
    
    	end = strpbrk(sbegin, ct);
    	if (end)
    		*end++ = '\0';
    	*s = end;
    	return sbegin;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    strtok

    char *strtok( char *str, const char *delim)

    char *strtok( char *restrict str, const char *restrict delim );(C99开始)

    功能:返回被分解的第一个子字符串,如果没有可检索的字符串,则返回一个空指针

    注意:此函数是破坏性的:它写入’\0’字符到字符串str的元素

  • 相关阅读:
    SpringMVC入门
    通过HTML网页对mysql数据库进行增删改查(CRUD实例)
    OpenHarmony实战开发-组件复用实践。
    【必知必会的MySQL知识】①初探MySQL
    【SpringBoot】SpringBoot自动配置底层源码解析
    行列视(RCV)能解决哪些问题?
    CI/CD工具中的CI和CD的含义
    【算法 - 动态规划】找零钱问题Ⅰ
    【网络编程套接字】基于UDP协议的网络程序
    Request和Response原理与详细运用
  • 原文地址:https://blog.csdn.net/Ghost_199503/article/details/128006752