C 语言中的 string.h 头文件

主要的几个函数如下所示.

1
2
3
4
5
6
size_t  strlen  (const char *str);
char *strcpy (char *dest, const char *src);
char *strncpy (char *dest, const char *src, size_t n);
char *strcat (char *dest, const char *src);
char *strncat (char *dest, const char *src, size_t n);
int strcmp (const char *str1, const char *str2);

strlen

1
size_t my_strlen(const char *str);
  • 返回当前字符串的长度, 即字符串末尾空字符 '\0' 前面的字符数量.

strcpy 和 strncpy

1
2
char *strcpy(char *dest, const char *src);
char *strncpy(char *dest, const char *src, size_t n);

返回值为指向 dest 的指针.

  • strcpy
    • strcpy函数将 src 中以空字符 '\0' 结束的字符串复制到 dest
    • 返回指向 dest 的指针
    • 如果 dest 不够大, 就会因数组越界而产生未定义行为
  • strncpy
    • strncpy函数会将最多 n 个字符从 src 中复制到 dest
    • n <= strlen(src) 时 src 末尾 '\0' 不会被复制过去
    • n > strlen(src) 剩余的字符由 '\0' 补上

实际开发中, 建议将 n 的值设定为 dest 长度 -1, 并主动将 dest 的最后一个元素设置为空字符, 这样总能安全地得到一个字符串.

strcat 和 strncat

1
2
char *strcat(char *dest, const char *src);
char *strncat(char *dest, const char *src, size_t n);

返回值为指向 dest 的指针.

函数将 src 拼接到 dest 末尾, 假设 dest_end 为 dest 末尾空字符的地址, 则函数可以如下理解.

  • strcat(dest, end);
    • 可以理解为strcpy(dest_end, src);
  • strncat(dest, end, n);
    • 可以理解为strncpy(dest_end, src, n);

实际开发中可以这样设置 n

1
2
// dest 数组的长度 - 已存储字符串的长度 - 1 (留 1 个位置给空字符)
int n = sizeof(dest) - strlen(dest) - 1;

并主动将 dest 的最后一个元素设置为空字符, 这样总能安全地得到一个字符串.

strcmp

1
int strcmp(const char *str1, const char *str2);

strcmp 函数按照字典顺序比较两个字符串的大小, 即 ASCII 码的编码值大的一方大.

该函数会依次比较同一位置的字符大小, 直到两字符不同或者到达’\0’字符.

  • 若 str1 和 str2 所有字符相同, 则返回值为0
  • str1 大, 返回值为正
  • str2 大, 返回值为负

若有一方到达了空字符, 另一方未到达空字符, 由于空字符的编码值为 0, 必定小于其他字符, 即 字符串长度大的 > 字符串长度小的