目录
求字符串长度
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); } }
编译结果: