一、常用的字符串处理函数

,它们主要定义在<string.h><ctype.h>头文件中:

1. 字符串长度

  • size_t strlen(const char *str);
    返回字符串的长度(不包含结束符'\0')。

2. 字符串复制

  • char *strcpy(char *dest, const char *src);
    将源字符串src复制到目标字符串dest(包括结束符)。
  • char *strncpy(char *dest, const char *src, size_t n);
    复制源字符串的前n个字符到目标字符串。如果src的长度小于n,则剩余部分用'\0'填充。

3. 字符串连接

  • char *strcat(char *dest, const char *src);
    将源字符串src追加到目标字符串dest的末尾(覆盖dest的结束符并添加新的结束符)。
  • char *strncat(char *dest, const char *src, size_t n);
    将源字符串的前n个字符追加到目标字符串末尾,并添加结束符。

4. 字符串比较

  • int strcmp(const char *str1, const char *str2);
    按字典序比较两个字符串。返回值为0表示相等,负数表示str1小于str2,正数表示str1大于str2
  • int strncmp(const char *str1, const char *str2, size_t n);
    比较两个字符串的前n个字符。

5. 字符串查找

  • char *strchr(const char *str, int c);
    查找字符串str中首次出现字符c的位置,返回指向该位置的指针,如果未找到则返回NULL
  • char *strrchr(const char *str, int c);
    查找字符串str中最后一次出现字符c的位置。
  • char *strstr(const char *haystack, const char *needle);
    在字符串haystack中查找子字符串needle的首次出现位置。(注:返回的是内存地址,并非常见的第0个位置,第1个位置)

6. 内存操作

  • void *memcpy(void *dest, const void *src, size_t n);
    从源内存地址复制n个字节到目标内存地址(不处理重叠)。
  • void *memmove(void *dest, const void *src, size_t n);
    复制内存块,处理重叠区域。
  • int memcmp(const void *ptr1, const void *ptr2, size_t n);
    比较两个内存区域的前n个字节。
  • void *memset(void *ptr, int value, size_t n);
    将内存区域的前n个字节设置为特定的值(通常用于清零)。

7. 其他实用函数

  • char *strpbrk(const char *str1, const char *str2);
    str1中查找第一个匹配str2中任意字符的位置。其功能是在第一个字符串str1中查找第一个匹配第二个字符串str2中任一字符的字符,并返回该字符在str1中的位置。

  • size_t strspn(const char *str1, const char *str2);
    返回str1中只包含str2中字符的最大起始段的长度。

    (第一遍没看懂,说明一下:

    (先找str2第一个字符,看看是不是在str1中,若在,cnt+1,然后找str2第二个字符是不是在str1中。直到找到不在str1中的字母,如此得到一个长度cnt。返回即可)

    cnt = 0

    while(str2的字符长度次){

    ​ str2[cnt]是否在str1中,

    ​ if 在{

    ​ cnt++;

    ​ }else{

    ​ retrun cnt;

    ​ }

    }

  • size_t strcspn(const char *str1, const char *str2);
    返回str1中第一个不包含于str2的字符出现的下标。

    (上一个函数的在和不在的条件对换,也就是如果不在str1中,计数加)

  • char *strtok(char *str, const char *delim);
    分割字符串为标记(注意:该函数会修改原始字符串)。

    (没看懂,查询得知,是根据某个字符delim将str给分割,比如以下例子,第一次调用将原字符串变为

    hellowora ldmynabcmeislihongfeng,并返回前一个字符串地址,将后一个字符串保存在_strtok的静态全局变量里面,以备下一次调用。第二次调用则是用b字符分割剩下的字符串。一直到字符串被分割完。(分割符号如果是多字符,则先用第一个字符分割,成功则返回,不成功再看第二个字符,以此类推)

    char a[] = "helloworabldmynabcmeislihongfeng";
    //					 b      b
    char * ch = strtok(a, "b");
    while(ch != NULL)
    {
        printf("ch = %s\n", ch);
        ch = strtok(NULL, "b");
    }
    
    //////////////////////////////
    输出:
    ch = hellowora
    ch = ldmyna
    ch = cmeislihongfeng
    

8. 字符类型判断(在<ctype.h>中)

  • isalpha(c) - 是否为字母
  • isdigit(c) - 是否为数字
  • isalnum(c) - 是否为字母或数字
  • isspace(c) - 是否为空白字符(空格、制表符、换行等)
  • tolower(c) - 转换为小写
  • toupper(c) - 转换为大写

9. 格式化字符串(在<stdio.h>中)

  • int sprintf(char *str, const char *format, ...);
    将格式化的字符串写入到str中。
  • int snprintf(char *str, size_t size, const char *format, ...);
    安全版本的sprintf,指定缓冲区大小防止溢出。

10. 字符串转换(在<stdlib.h>中)

  • double atof(const char *str);
    将字符串转换为双精度浮点数。
  • int atoi(const char *str);
    将字符串转换为整数。
  • long atol(const char *str);
    将字符串转换为长整数。
  • long long atoll(const char *str);
    将字符串转换为长长整数。

11. 错误处理

  • char *strerror(int errnum);
    返回错误码对应的错误信息字符串(定义在<string.h>)。

二、时间相关函数

时间表示有两种:

时间戳:time_t

时间结构体:

struct tm {
    int tm_sec;   // 秒 [0-60]
    int tm_min;   // 分 [0-59]
    int tm_hour;  // 时 [0-23]
    int tm_mday;  // 月中的日 [1-31]
    int tm_mon;   // 月 [0-11](0=1月)
    int tm_year;  // 年(1900起)
    int tm_wday;  // 周 [0-6](0=周日)
    int tm_yday;  // 年中的日 [0-365]
    int tm_isdst; // 夏令时标志
};

1.获取时间

  • time_t time(time_t *timer);

获取当前系统时间(从1970年1月1日UTC 00:00:00起经过的秒数)

  • clock_t clock(void);

获取程序执行时间,转换成秒需要除以CLOCKS_PER_SEC

2.时间戳格式转换

  • struct tm *localtime(const time_t *timer);

    转换为本地时间

  • struct tm *gmtime(const time_t *timer);

    不考虑时区,转换

  • time_t mktime(struct tm *timeptr);

时间转换成时间戳

3.时间格式化输出

  • char *ctime(const time_t *timer);
  • char *asctime(const struct tm *timeptr);

返回样式: “Mon Jun 3 15:30:05 2024\n”

  • size_t strftime(char *str, size_t maxsize, const char *format, const struct tm *timeptr);

    (类比snprintf函数)

自定义格式输出:

参数

  • str - 输出缓冲区

  • maxsize - 缓冲区最大容量

  • format - 格式字符串

  • timeptr - 指向tm结构体的指针

  • 返回值
    输出的字符数(不包括终止符),缓冲区不足时返回0

占位符:

符号意义示例
%Y四位年份2024
%y二位年份24
%m月(01-12)06
%d日(01-31)03
%H24小时制(00-23)15
%I12小时制(01-12)03
%M分(00-59)30
%S秒(00-59)05
%A完整星期名Monday
%a缩写星期名Mon
%B完整月份名June
%b缩写月份名Jun
%pAM/PMPM
%c标准日期时间本地化格式

更多推荐