长度
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;
}
比较
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;
}
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;
}
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;
}
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;
}
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;
}
分割
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;
}
strtok
char *strtok( char *str, const char *delim)
char *strtok( char *restrict str, const char *restrict delim );
(C99开始)
功能:返回被分解的第一个子字符串,如果没有可检索的字符串,则返回一个空指针
注意:此函数是破坏性的:它写入’\0’字符到字符串str
的元素