string.h
,提供与字符串操作相关的函数。
类型
size_t
为 sizeof
的返回值,是 unsigned long long
的别名。
宏
NULL
表示空指针,值为 0LL
。
函数
void* memchr(const void* str, int c, size_t n)
返回 str
所指向的字符串的前 n
个字字节中第一次出现字符 c
的位置。
c
为字符的 ASCII
编码,返回一个无类型的指针指向该位置,未找到则返回 NULL
。
尽管 c
为 int
类型,但是实际上只会用到 c
的低8位,即 c % 256
。
1 2 3 4 5 6 7 8 9 10 11
| #include <stdio.h> #include <string.h>
int main() { char str[] = "http://www.shigure.link"; char ch = '.'; char* res; res = (char*)memchr(str, ch, strlen(str)); printf("|%s|\n",res); }
|
int memcmp(const void* str1, const void* str2, size_t n)
比较 str1
和 str2
指向的内存空间的前 n
个字节。
str1
> str2
时,返回结果大于0
str1
= str2
时,返回结果等于0
str1
< str2
时,返回结果小于0
注: ANSI C
只规定了返回值的正负性,具体返回值及其特殊意义在不同编译器中各不相同。
str1
和 str2
不止局限于字符串,其他数组也可以。
1 2 3 4 5 6 7 8 9
| #include <stdio.h> #include <string.h>
int main() { char str1[] = "ABCDE"; char str2[] = "abcde"; printf("%d\n", memcmp(str1,str2,sizeof(str1))); }
|
void* memcpy(void* dest, const void* src, size_t n)
将 src
指向的储存区的前n个字节复制到 dest
指向的储存区,返回 dest
。
dest
和 src
不止局限于字符串,其他数组也可以。
如果 src
和 dest
区域有重叠,则会导致数据被破坏或者其他未定义行为。
1 2 3 4 5 6 7 8 9 10
| #include <stdio.h> #include <string.h>
int main() { char str1[] = "ABCDE"; char str2[6]; memcpy(str2,str1,sizeof(str1)); printf("%s\n", str2); }
|
void* memmove(void* dest, const void* src, size_t n)
同 memcpy
,但是在 src
和 dest
区域有重叠时会更加安全,不过速度会慢于 memcpy
。
1 2 3 4 5 6 7 8 9 10
| #include <stdio.h> #include <string.h>
int main() { char str1[] = "ABCDE"; char str2[6]; memmove(str2,str1,sizeof(str1)); printf("%s\n", str2); }
|
void* memset(void* str, int c, size_t n)
将指定的值 c
复制到 str
所指储存区的前n个字节,返回 str
。
函数不会做边界检查,谨防缓冲区溢出。
尽管 c
为 int
类型,但是实际上只会用到 c
的低8位,即 c % 256
。
1 2 3 4 5 6 7 8 9
| #include <stdio.h> #include <string.h>
int main() { char str1[16] = "ABCDE"; memset(str1,'6',sizeof(str1)); printf("%s\n", str1); }
|
char* strcat(char* dest, const char* src)
把 src
所指向的字符串追加到 dest
所指向的字符串的末尾,返回 dest
。
函数不会进行边界检查,谨防缓冲区溢出。
1 2 3 4 5 6 7 8 9 10
| #include <stdio.h> #include <string.h>
int main() { char str1[16] = "ABCDE"; char str2[] = "FGHIJ"; strcat(str1,str2); printf("%s\n",str1); }
|
char* strncat(char* dest, const char* src, size_t n)
把 src
所指向的字符串的前n个字节追加到 dest
所指向的字符串的末尾,返回 dest
。
1 2 3 4 5 6 7 8 9 10
| #include <stdio.h> #include <string.h>
int main() { char str1[16] = "ABCDE"; char str2[] = "FGHIJ"; strncat(str1,str2,2); printf("%s\n",str1); }
|
char* strchr(const char* str, int c)
返回字符 c
在字符串 str
中第一次出现的位置,未找到则返回 NULL
。
尽管 c
为 int
类型,但是实际上只会用到 c
的低8位,即 c % 256
。
1 2 3 4 5 6 7 8 9 10 11
| #include <stdio.h> #include <string.h>
int main() { char str[] = "http://www.shigure.link"; char ch = '.'; char* res; res = (char*)strchr(str, ch); printf("|%s|\n", res); }
|
int strcmp(const char* str1, const char* str2)
比较字符串 str1
和 str2
(字典序)。
str1
> str2
时,返回结果大于0
str1
= str2
时,返回结果等于0
str1
< str2
时,返回结果小于0
注: ANSI C
只规定了返回值的正负性,具体返回值及其特殊意义在不同编译器中各不相同。
1 2 3 4 5 6 7 8 9
| #include <stdio.h> #include <string.h>
int main() { char str1[] = "ABCDE"; char str2[] = "abcde"; printf("%d\n", strcmp(str1,str2)); }
|
int strncmp(const char* str1, const char* str2, size_t n)
比较字符串 str1
和 str2
的前 n
个字节。
str1
> str2
时,返回结果大于0
str1
= str2
时,返回结果等于0
str1
< str2
时,返回结果小于0
注: ANSI C
只规定了返回值的正负性,具体返回值及其特殊意义在不同编译器中各不相同。
1 2 3 4 5 6 7 8 9
| #include <stdio.h> #include <string.h>
int main() { char str1[] = "ABCDE"; char str2[] = "abcde"; printf("%d\n", strncmp(str1,str2,4)); }
|
int strcoll(const char* str1, const char* str2)
同 strcmp
,但是会基于当前系统语言规则进行比较(本地化)。
1 2 3 4 5 6 7 8 9 10 11 12
| #include <stdio.h> #include <string.h> #include <locale.h>
int main() { setlocale(LC_COLLATE, "en_US.UTF-8");
char str1[] = "Apple"; char str2[] = "Banana"; printf("%d\n", strcoll(str1,str2)); }
|
char* strcpy(char* dest, const char* src)
将字符串 src
复制到字符串 dest
,返回 dest
。
函数不会进行边界检查,谨防缓冲区溢出。
1 2 3 4 5 6 7 8 9 10
| #include <stdio.h> #include <string.h>
int main() { char str1[] = "ABCDE"; char str2[6]; strcpy(str2,str1); printf("%s\n", str2); }
|
char* strncpy(char* dest, const char* src, size_t n)
将字符串 src
的前n个字节复制到字符串 dest
,返回 dest
。
函数不会进行边界检查,谨防缓冲区溢出。
1 2 3 4 5 6 7 8 9 10
| #include <stdio.h> #include <string.h>
int main() { char str1[] = "ABCDE"; char str2[] = "HIJKL"; strncpy(str2,str1,2); printf("%s\n", str2); }
|
size_t strcspn(const char* str1, const char* str2)
返回 str1
从开头连续有几个字符不包含于 str2
中。
1 2 3 4 5 6 7 8 9
| #include <stdio.h> #include <string.h>
int main() { char str1[] = "ABCDE"; char str2[] = "DERFGT"; printf("%d\n", strcspn(str1,str2)); }
|
char* strerror(int errnum)
返回错误代码对应的描述错误的字符串,未找到则返回 NULL
。
1 2 3 4 5 6 7 8 9 10 11 12
| #include <stdio.h> #include <string.h> #include <errno.h>
int main() { FILE* file = fopen("non_existent_file.txt", "r"); if (file == NULL) { printf("Error: %s\n", strerror(errno)); } return 0; }
|
size_t strlen(const char* str)
返回字符串的长度(不包括结束符)。
1 2 3 4 5 6 7 8 9 10
| #include <stdio.h> #include <string.h>
int main() { char str1[] = "ABCDE"; printf("%d\n", sizeof(str1)); printf("%d\n", strlen(str1)); }
|
char* strpbrk(const char* str1, const char* str2)
返回 str1
中第一个出现在 str2
中的字符的位置,未找到则返回 NULL
。
1 2 3 4 5 6 7 8 9
| #include <stdio.h> #include <string.h>
int main() { char str1[] = "ABCDE"; char str2[] = "DERFGT"; printf("%c\n", *strpbrk(str1,str2)); }
|
char* strrchr(const char* str, int c)
返回字符 c
在字符串 str
中最后一次出现的位置,未找到则返回 NULL
。
尽管 c
为 int
类型,但是实际上只会用到 c
的低8位,即 c % 256
。
1 2 3 4 5 6 7 8 9 10 11
| #include <stdio.h> #include <string.h>
int main() { char str[] = "http://www.shigure.link"; char ch = '.'; char* res; res = (char*)strrchr(str, ch); printf("|%s|\n", res); }
|
size_t strspn(const char* str1, const char* str2)
返回 str1
中第一个不存在于 str2
中的字符的索引,未找到则返回结束符的索引。
1 2 3 4 5 6 7 8 9
| #include <stdio.h> #include <string.h>
int main() { char str1[] = "RTFABCDE"; char str2[] = "DERFGT"; printf("%d\n", strspn(str1,str2)); }
|
char* strstr(const char* str1, const char* str2)
返回字符串 str2
在 str1
中第一次出现的位置,未找到则返回 NULL
。
1 2 3 4 5 6 7 8 9
| #include <stdio.h> #include <string.h>
int main() { char str1[] = "Hello,world"; char str2[] = "llo"; printf("%s\n", strstr(str1,str2)); }
|
char* strtok(char* str, const char* delim)
分割 str
, delim
为分割的分隔符,返回被分割的第一个字符串。
str
为 NULL
时,返回下一个分割出的字符串下一个字符串不存在时则返回 NULL
。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| #include <stdio.h> #include <string.h>
int main() { char str[] = "Hello world ,welcome to C"; char* token = strtok(str, " "); while (token != NULL) { printf("%s\n", token); token = strtok(NULL, " "); } return 0; }
|
size_t strxfrm(char* dest, const char* src, size_t n)
根据系统当前区域转换字符串 src
的前n个字符并储存在 dest
中,返回被转换的字符串长度,不包括结束符。可用于 strcmp
比较,组合使用时,等效于 strcoll
。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| #include <stdio.h> #include <string.h> #include <locale.h>
int main() { setlocale(LC_COLLATE, "en_US.UTF-8");
char str1[] = "apple"; char str2[] = "banana";
char transformed1[100], transformed2[100];
strxfrm(transformed1, str1, 100); strxfrm(transformed2, str2, 100);
printf("%d\n",strcmp(transformed1, transformed2)); }
|