C标准库-string.h

7.1k 词

string.h ,提供与字符串操作相关的函数。

类型

  1. size_tsizeof 的返回值,是 unsigned long long 的别名。

  1. NULL 表示空指针,值为 0LL

函数

  1. void* memchr(const void* str, int c, size_t n)

返回 str 所指向的字符串的前 n 个字字节中第一次出现字符 c 的位置。

c 为字符的 ASCII 编码,返回一个无类型的指针指向该位置,未找到则返回 NULL

尽管 cint 类型,但是实际上只会用到 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);
}
// |.shigure.link|
  1. int memcmp(const void* str1, const void* str2, size_t n)

比较 str1str2 指向的内存空间的前 n 个字节。

str1 > str2 时,返回结果大于0
str1 = str2 时,返回结果等于0
str1 < str2 时,返回结果小于0
注: ANSI C 只规定了返回值的正负性,具体返回值及其特殊意义在不同编译器中各不相同。

str1str2 不止局限于字符串,其他数组也可以。

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)));
}
// -1
  1. void* memcpy(void* dest, const void* src, size_t n)

src 指向的储存区的前n个字节复制到 dest 指向的储存区,返回 dest

destsrc 不止局限于字符串,其他数组也可以。

如果 srcdest 区域有重叠,则会导致数据被破坏或者其他未定义行为。

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);
}
// ABCDE
  1. void* memmove(void* dest, const void* src, size_t n)

memcpy ,但是在 srcdest 区域有重叠时会更加安全,不过速度会慢于 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);
}
// ABCDE
  1. void* memset(void* str, int c, size_t n)

将指定的值 c 复制到 str 所指储存区的前n个字节,返回 str

函数不会做边界检查,谨防缓冲区溢出。

尽管 cint 类型,但是实际上只会用到 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);
}
// 666666
  1. 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);
}
// ABCDEFGHIJ
  1. 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);
}
// ABCDEFG
  1. char* strchr(const char* str, int c)

返回字符 c 在字符串 str 中第一次出现的位置,未找到则返回 NULL

尽管 cint 类型,但是实际上只会用到 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);
}
// |.shigure.link|
  1. int strcmp(const char* str1, const char* str2)

比较字符串 str1str2 (字典序)。

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));
}
// -1
  1. int strncmp(const char* str1, const char* str2, size_t n)

比较字符串 str1str2 的前 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));
}
// -1
  1. 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));
}
// -1
  1. 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);
}
// ABCDE
  1. 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);
}
// ABJKL
  1. 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));
}
// 3
  1. 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;
}
// No such file or directory
  1. 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));
}
// 6
// 5
  1. 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));
}
// D
  1. char* strrchr(const char* str, int c)

返回字符 c 在字符串 str 中最后一次出现的位置,未找到则返回 NULL

尽管 cint 类型,但是实际上只会用到 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);
}
// |.link|
  1. 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));
}
// 3
  1. char* strstr(const char* str1, const char* str2)

返回字符串 str2str1 中第一次出现的位置,未找到则返回 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));
}
// llo,world
  1. char* strtok(char* str, const char* delim)

分割 strdelim 为分割的分隔符,返回被分割的第一个字符串。

strNULL 时,返回下一个分割出的字符串下一个字符串不存在时则返回 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;
}
/*
Hello
world
,welcome
to
C
*/
  1. 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));
}
// -1
留言