目录
求字符串长度
strlen
声明:
size_t strlen(const char *str)
介绍:
该函数是求字符串 str 长度,直到 '\0' 结束,且不包括 '\0 '。
参数:
str----要计算长度的字符串。
返回值:
返回值类型为size_t类型,相当与无符号整型,返回值为字符串str的长度。
使用:
#include<stdio.h>
#include<string.h>
int main()
{
char arr1[20] = { "hollow" };
printf("%d", strlen(arr1));
}
编译结果为:6
函数模拟实现:
size_t my_strlen(const char* p)
{
assert(p);
if (* p == '\0')
return 0;
return 1 + my_strlen(p+1);
}
长度不受限制的字符串操作函数
strcpy
声明:
char *strcpy(char *dest, const char *src)
介绍:
字符串拷贝函数,将字符串 src 拷贝至 dest
参数:
dest----拷贝的目的地,即目标字符串。
src----被拷贝的字符串。
返回值:
返回类型为 char*,字符串指针,返回最终目标字符串dest的指针。
注意事项:
(1)目标字符串必须可变。
(2)目标字符串的存储空间必须足够大。
(3)拷贝时会将 '\0' 拷贝上。
使用:
int main()
{
char a[20] = { "abcdefg" };
char b[4] = { "xxx" };
strcpy(a, b);
printf("%s",a);
}
编译结果:xxx
模拟实现:
char* my_strcpy(char*a,const char* b)
{
assert(a && b);
char* p = a;
while (*a++ = *b++);
return p;
}
strcat
声明:
char *strcat(char *dest, const char *src)
介绍:
字符串追加函数,将src所指向的字符串追加至dest所指向字符串的末尾,会将dest所指向字符串末尾的 '\0' 覆盖。
参数:
dest----指向目标数组,该数组包含了一个 C字符串,且足够容纳追加后的字符串指向目标数组,该数组包含了一个 C 字符串,且足够容纳追加后的字符串。
src----指向要追加的字符串。
返回值:
一个指向最终目标字符串的指针
使用:
int main()
{
char a[20] = { "hollow" };
char b[] = { " world" };
strcat(a,b);
printf("%s", a);
}
结果:hollow world
模拟实现:
char* my_strcat(char* a, const char* b)
{
assert(a,b);
char* p = a;
while (*a != '\0');
{
a++;
}
while (*a++ =*b++);
return p;
}
strcmp
声明:
int strcmp(const char *str1, const char *str2)
介绍:
比较两个字符串大小,这个大小不是字符串长度,而是从第一个字符开始比较ASCII值,若相同,则继续比较下一个字符,若不同,则终止比较。
参数:
str1----进行比较的第一个字符串
str2---进行比较的第二个字符串
返回值:
str1 > str2 时返回大于0的数
str1 = str2 时返回0
str1 = str2 时返回小于0的数
使用:
int main()
{
char a[4] = { "abc" };
char b[4] = { "def" };
int ret = strcmp(a, b);
printf("%d", ret);
}
结果:-1
在vs2019编译器上,str1 >str2 时返回1,str1<str2时返回-1。但是时C标准,返回值并未规定为固定值。
模拟实现:
int my_strcmp(char* str1, char* str2)
{
assert(str1&&str2);
while (*str1 == *str2)
{
if (*str1 != '\0')
return 0;
str1++;
str2++;
}
return *str1 - *str2;
}
长度受限制的字符串操作函数
strncpy
声明:
char *strncpy(char *dest, const char *src, size_t n)
介绍:
相对于strcpy多了一个参数,‘size_t n ’----代表所要拷贝的字节数,把 src 所指向的字符串复制到 dest,最多复制 n 个字节的字符(末尾不会自动补 '\0' )。当 src 的长度小于 n 时,dest 的剩余部分将用空字节填充。
参数:
- dest -- 指向用于存储复制内容的目标数组。
- src -- 要复制的字符串。
- n -- 要从源中复制的字符数。
返回值:
返回类型为 char*,字符串指针,返回最终目标字符串dest的指针。
使用:
#include<stdio.h>
#include<string.h>
int main()
{
char a[30] = { "abcdefgh" };
char b[] = { "xxx" };
strncpy(a, b, 3);
printf("%s", a);
}
编译结果:xxxdefgh
strncat
声明:
char *strncat(char *dest, const char *src, size_t n)
介绍:
把 src 所指向的字符串追加到 dest 所指向的字符串的结尾,直到 n 个字符长度为止(末尾会自动补 '\0' ),当src的长度小于n时,只会追加至 n 个字符截至。(注意与strncpy的不同)
参数:
- dest -- 指向目标数组,该数组包含了一个 C 字符串,且足够容纳追加后的字符串,包括额外的空字符。
- src -- 要追加的字符串。
- n -- 要追加的最大字符数。
返回值:
指向最终目标字符串的指针。
使用:
int main()
{
char a[30] = { "hollow " };
char b[] = { "world" };
strncat(a, b, 5);
printf("%s", a);
}
编译结果:hollow world
字符串查找函数
strstr
声明:
char *strstr(const char *haystack, const char *needle)
介绍:
在字符串 haystack 中查找第一次出现字符串 needle 的位置,不包含终止符 '\0'。
参数:
- haystack -- 要被检索的 C 字符串。
- needle -- 在 haystack 字符串内要搜索的小字符串。
返回值:
返回在 haystack 中第一次出现 needle 字符串的位置,如果未找到则返回 null。
使用:
int main()
{
char a[] = { "abcd" };
char b[] = { "efg" };
printf("%s",strstr(a, b));
}
编译结果:(null)
模拟实现:
char * my_strstr(char* p1, char* p2)
{
assert(p1 && p2);
if (!*p2)
return p1;
char* s1 = p1;
char* s2 = p2;
char* cur = p1;
while (*cur)
{
s1 = cur;
s2 = p2;
while (*s1 && *s2 && s1 == s2)
{
s1++;
s2++;
}
if (!*s2 )
return cur;
if (!*s1)
return NULL;
cur++;
}
return NULL;
}
字符串分割函数
strtok:
声明:
char *strtok(char *str, const char *delim)
介绍:
以某些分隔符为分割点,将字符串分割为多段。
参数:
str--要被分割的字符串
delim--存放分割符的字符串
返回值:
该函数返回被分解的第一个子字符串,如果没有可检索的字符串,则返回一个空指针。当返回第一个被分解的第一个字符串后,会将分割符化为 '\0' ,若想继续分割该段字符串,再次调用该函数,并将第一个参数改为空指针。
使用:
int main()
{
char a[] = { "342.452*531+.345" };
char b[] = { ".*+" };
for (char* p = strtok(a, b); p != NULL; p = strtok(NULL, b))
{
printf("%s\n", p);
}
}
编译结果: