字符串处理的库函数介绍

  • 要查看完整的函数请阅读cppreference帮助文档,笔记中的重点在于介绍使用的细节、帮助文档中未详细介绍的用法、使用实例等
  • 本篇内容介绍的库函数,头文件包含 <string.h> 至于详细介绍,请参阅cppreference帮助文档

获取字符串长度(strlen)

  • 函数原型:size_t strlen( const char *str );
  • 功能:返回字符串 str 的长度(不包括终止空字符 ‘\0’)
  • 注意事项:
    • str 必须是指向以 ‘\0’ 结尾的字符串的有效指针
    • 如果 str 为空指针,则行为未定义
    • 返回类型 size_t 是无符号整数类型,在比较时需注意避免意外的符号问题s

字符串拷贝(strcpy、strncpy)

  • strcpy
    • 函数原型:char *strcpy(char *dest, const char *src);
    • 功能:将 src 所指向的字符串(包括空字符 ‘\0’)复制到 dest 所指向的数组中
    • 注意事项:
      • 目标数组 dest 必须足够大,以容纳源字符串的内容,包括终止空字符
      • 如果 dest 和 src 所指向的内存区域重叠,则行为未定义
      • 使用 strcpy 时需确保 dest 有足够空间,否则可能导致缓冲区溢出。更安全的替代函数包括 strncpy、snprintf 或 strcpy_s(如果支持)s
  • strncpy
    • 函数原型:char *strncpy( char *dest, const char *src, size_t count );
    • 功能:将 src 所指向的字符串(包括空字符 ‘\0’),复制count个字符到 dest 所指向的数组中
    • 注意事项:
      • 只拷贝指定个数的字符,所以可能不包含’\0’
      • 如果source字符串长度小于count,则在destination字符串后追加0,直到count个

字符串拼接(strcat、strncat)

  • strcat

    • 函数原型:char *strcat(char *dest, const char *src);
    • 功能:将 src 所指向的字符串(包括终止空字符 ‘\0’)追加到 dest 所指向的字符串的末尾。 dest 中的原始终止空字符会被 src 的第一个字符覆盖,字符串以新的终止空字符结束
    • 注意事项:
      • 目标数组 dest 必须足够大,以容纳其原始内容和 src 的内容,包括终止空字符
      • 如果 dest 和 src 所指向的内存区域重叠,则行为未定义
      • 使用 strcat 时需确保 dest 有足够空间,否则可能导致缓冲区溢出。更安全的替代函数包括 strncat、snprintf 或 strcat_s(如果支持)

    注:strcat常见错误如下

    char arr1[] = "hello";
    char arr2[] = "word";
    strcat(arr1, arr2);
    printf("%s\n", arr1);

    分析:

    • 在使用strcat()函数时,dest指向的字符串要有足够的空间
    • 在追加时,是在\0处追加,而不是在字符串末尾
    • 源字符串必须以‘\0’结束
    • 目标空间必须可修改
    • 字符串自己给自己追加?一般程序会崩溃
  • strncat

    • 函数原型:char *strncat( char *dest, const char *src, size_t count );

    • 功能:限制了追加字符个数,追加指定字符个数后在后面追加一个’\0’

    • 库中的strncat的写法:

      char *strncat(char *dest, const char *source, int count) {
          char *ret = dest;
          while (*dest++)
              ;
          dest--;
          while (count--)
              if (!(*dest++ = *source++))
                  return ret;
          *dest = 0;
          return ret;
      }

字符串比较(strcmp、strncmp)

  • strcmp
    • 函数原型:int strcmp( const char *lhs, const char *rhs );
    • 功能:比较两个字符串(一个个字符比较ASCLL码值),若相等则返回0
  • strncmp
    • 函数原型:int strncmp( const char *lhs, const char *rhs, size_t count );
    • 功能:比较两个字符串,且只比较指定字符个数

字符串查找(strstr、strtok)

  • strstr

    • 函数原型:char *strstr( const char* str, const char* substr );

    • 功能:返回指向于str中找到的子串首字符的指针,若找不到则返回空指针

    • 库中的写法如下

      char* strstr(const char* str, const char* substr) {
          char* cp = (char*) str;
          char *s1, *s2;
          if (!*substr)
              return (char*) str;
          while (*cp) {
              s1 = cp;
              s2 = (char*) substr;
              while (*s1 && *s2 && !(*s1 - *s2))
                  s1++, s2++;
              if (!*s2)
                  return cp;
              cp++;
          }
          return NULL;
      }

    注:在数据结构与算法中,KMP算法可以很好的实现这个功能

  • strtok

    • 函数原型:char *strtok( char *str, const char *delim );

    • 功能:返回指向下个记号起始的指针,若无更多记号则返回空指针

    • 实例:

      利用strtok分割IP地址

      char ip[] = "192.168.1.1";
      char* p = ".";
      char* ret = NULL;
      for (ret = strtok(ip, p); ret != NULL; ret = strtok(NULL, p)) {
          printf("%s\n", ret);
      }

错误信息打印(strerror)

  • strerror

    • 函数原型:char* strerror( int errnum );

    • 功能:传递错误码,返回字符指针(错误信息的地址)

    • 使用方法

      char* str = strerror(errno);
      
      // errno需要引用头文件<errno.h>,它是一个全局变量(错误码变量)
      // 在打开文件时,可以使用这个方法处理发生错误的情况

字符分类函数、字符转化函数

  • 字符分类函数

    函数 参数的符号满足下列条件时,返回真
    iscntrl 任何控制字符
    isspace 空白字符:空格、换页’、换行’‘、回车’、制表符’、垂直制表符’
    isdigit 十进制数字0~9
    isxdigit 十六进制数字,包含十进制数字、小写字母af、大写字母AF
    islower 小写字母a~z
    isupper 大写字母A~Z
    isalpha 小写字母或大写字母
    isalnum 0~9数字或大小写字母
    ispunct 标点符号,任何不属于数字或字母的图形字符(可打印)
    isgrapg 任何图形字符
    isprint 任何可打印字符:含图形字符、空白字符
  • 字符转化函数

    函数 含义
    int tolower(int c); 转小写字母
    int toupper(int c); 转大写字母
« 指针进阶 ← 返回列表 内存管理的库函数介绍 »